1. 모바일 화면 기획의 기본

모바일 화면 기획을 한다면 아래 두 사이트는 너무너무너무 필수!! 이게 왜 중요한지도 적고 싶지만 개발 공부가 급하기 때문에 패스...

여튼 다른 ui 패턴 보기 전에 아래 두 가이드라인은 필수로 꼭 봐야함

아래 두 자료가 왜 중요한지 찾아보는 것도 좋은 공부가 될 것임

https://material.io/design

 

Material Design

Build beautiful, usable products faster. Material Design is an adaptable system—backed by open-source code—that helps teams build high quality digital experiences.

material.io

https://developer.apple.com/design/human-interface-guidelines/

 

Human Interface Guidelines - Design - Apple Developer

Human Interface Guidelines Get in-depth information and UI resources for designing great apps that integrate seamlessly with Apple platforms.

developer.apple.com

 

2. 실제 서비스하는 앱들의 UI 패턴 모음 사이트

https://www.mobile-patterns.com/

 

Mobile Patterns - UI UX Inspirational Gallery for iOS and Android

 

www.mobile-patterns.com

https://uigarage.net/

 

UI Garage – Specific UI Design inspiration & Pattern for your design.

Daily UI inspiration & patterns for designers, developers to find inspiration, tools and the best resources for your project.

uigarage.net

https://mobbin.design/patterns

 

Mobbin - Latest Mobile Design Patterns

Check out the hand-picked collection of latest mobile design patterns from apps that reflect the best in design.

mobbin.design

 

3. 모바일 앱 기획 시 주의사항 관련 좋은 글

https://brunch.co.kr/@chulhochoiucj0/8

 

모바일 UI·UX 디자인시 고려해야 할 가이드라인 1

애플 iOS HIG와 Material design 가이드를 중심으로 | 모바일 앱과 웹 디자인은 데스크톱 웹 디자인과는 많은 부분이 다릅니다. 이는 각 기기device의 특성과 사용 맥락의 차이에서 기인합니다. 우선 모

brunch.co.kr

(위 시리즈는 정독을 권함)

https://uxdesign.cc/habituation-and-user-experience-ux-4985bf49fa74

 

Habituation and User Experience (UX)

The risks of having your users habituated to bad user experiences

uxdesign.cc

https://brunch.co.kr/@supernova9/195

 

좋은 UI설계서란 무엇일까?

그건 마치 연애편지 같은 보험약관이랄까... | '거기로 가면 다 죽습니다!' 옛날 전쟁 사극을 보면 인상을 잔뜩 구긴 장군 아저씨들이 블루마블 게임판 같은걸 탁자에 착! 깔아놓고 '네 말이 맞네

brunch.co.kr

https://brunch.co.kr/@supernova9/180

 

따릉아! 문제는 UX/UI야!

공공기관 앱계의 디아블로 따릉이를 구원해보자! | 얼마 전 따릉이를 타려다 스마트폰을 보도블록에 내려놓고 '답답해!!!!! 죽겠다!!!!!!!!’ 하고 소리를 지를뻔했다. 따릉이 앱 사용이 미친 듯이

brunch.co.kr

갓광섭님의 다른 글 또한 물론 강추!

https://www.mobiinside.co.kr/2021/05/27/senior-ux-design/

 

[쓰면서 정리하는 UX 디자인] 시니어 세대를 위한 모바일 UX 디자인 Tips - 모비인사이드 MOBIINSIDE

[쓰면서 정리하는 UX 디자인] 시니어 세대를 위한 모바일 UX 디자인 Tips - 모바일 모비인사이드 MOBIINSIDE

www.mobiinside.co.kr

 

Week7.
Part 1. Loops and Iterations

' While '               (Jump to Python - while문 = 'https://wikidocs.net/21')
- syntax :
  while 종료조건:
     ~~~~

- Iteration Variables : 루프를 돌 때마다 변하는 변수로써 루프의 종료조건을 나타내기 위해 사용.

- ' break '
#-*- coding: utf8 -*-
# 파이참 한글주석 인코딩 해결 코드임

while True :                # 'True' = 예약어. 항상 참
    line = raw_input('>')   # 'line'이라는 이름으로 입력을 계속해서 받음
    if line == 'done' :     # 만약 line이라는 입력의 내용으로 'done'이 들어온다면,
        break               # 'break' 반복문이 break를 만나면 루프탈출
    print line              # input이 'done'이 아닌이상 입력된 내용을 계속 출력
print 'Done!'

- ' continue '
     The continue statement ends the current iteration and jumps to the top of the loop and starts the
     next iteration. == continue 문은 최근의 반복문을 종료하고 loop의 처음으로 돌아가 반복을 다시 
     시작. 즉 continue 밑에 코드들은 무시하고 iteration의 시작부분으로 올라감. loop의 종료조건에
     영향 안끼침.
#-*- coding: utf8 -*-
# 파이참 한글주석 인코딩 해결 코드임
while True :                # 'True' = 예약어. 항상 참
    line = raw_input('>')   # 'line'이라는 이름으로 입력을 계속해서 받음
    if line[0] == '#' :     # 파이썬은 문자열을 자동으로 array 형식으로 저장하는 모양이다.
        continue
    if line == 'done' :     # 만약 line이라는 입력의 내용으로 'done'이 들어온다면,
        break               # 'break' 반복문이 break를 만나면 루프탈출
    print line              # input이 'done'이 아닌이상 입력된 내용을 계속 출력
print 'Done!'
----output-----
C:\Users\Hyunwoo\Anaconda2\python.exe C:/Users/Hyunwoo/PycharmProjects/coursera/coursera_practice.py
>hello there
hello there
>print this
print this
># don't print this
>done
Done!

Process finished with exit code 0
------end--------

' for '          (Jump to Python - for문 = 'https://wikidocs.net/22')
- syntax
for 변수 in 리스트(또는 튜플, 문자열):
     수행할 문장1수행할 문장2...

- ' in '
     set이나 tuple or list에 있는 element들을 순서대로 한 단위씩 훑음.


Part 2. Loop Idioms. - How We Construct Loops?
Loop를 활용한 다양한 예시들.
  •  예제. list에서 가장 큰 수 찾기.
  •  예제 2. Counting in a Loop. Summing in a Loop. Finding the Average in a Loop. 
  • Serach Using a Boolean Variable

Part 3. Largest and Smallest
  • Finding Smallest Number
가장 작은 값을 표시하는 변수를 특정 값으로 초기화 할 시 list 내에서 가장 작은 값을 못찾을 수도 있음. ex) smallest = -1로 초기화. list = [3, 41, 12]일 때 일반적인 방법으론 가장 작은 값은 -1로 출력됨.
해결책 -------> 가장 작은 값을 number가 아니라 다른 type으로 초기화하면 됨.
' none '
- 가장 작은 값임을 의미함.
#-*- coding: utf8 -*-
# == 파이참 한글주석 인코딩 해결 코드

smallest = None

print 'Before'

for value in [9411237415] :
    if smallest is None :       # ' is ' = 파이썬 연산자. '=='과 같은 의미
        smallest = value        # smallest를 list 내의 값으로 초기화 해주어야함. None은 Numeric한 값이 아니기 때문에 초기화해주지 않으면 대소를 비교할 수 없음.
    elif value < smallest :
        smallest = value
    print smallestvalue

print 'After'smallest

------output------
Before
9 9
9 41
9 12
3 3
3 74
3 15
After 3

Process finished with exit code 0
-------end------

' is ' and ' is not ' Operators
- 파이썬 연산자의 일종.
- ' == '과 같은 의미로 사용.
- ' == '은 numeric한 value일 때 주로사용.
- ' is '는 None이나 False 같이 logical expression에 주로 사용.
- ' is '를 너무 남용하는 것은 좋지 않음. 에러를 일으킬 수도. 적재적소에 쓰자!

----------Asignment---------
5.2 Write a program that repeatedly prompts a user for integer numbers until the user enters 'done'. Once 'done' is entered, print out the largest and smallest of the numbers. If the user enters anything other than a valid number catch it with a try/except and put out an appropriate message and ignore the number. Enter the numbers from the book for problem 5.1 and Match the desired output as shown.
------------CODE------------
#-*- coding: utf8 -*-
# == 파이참 한글주석 인코딩 해결 코드

largest = None
smallest = None
i = 0
num = range(100)        # 100개의 list 선언. C의 array처럼 했었음(당연히 에러). list 선언하는 법 기억하기.

while True:

    num[i] = raw_input("Enter a number: ")
    if num[i] == 'done'# 입력이 'done'이면 종료.
        break
    try :                       # 종료조건인 'done' 또한 error를 발생시켜 except에 있는 continue 때문에 무한루프를
        only_number = float(num[i])     #발생시켜 try위로 빼놓고 int형 변환을 하지않은 채로 두었다.

        if smallest is None :   #하나의 조건문으로 합쳐서 표현했었더니 이상하게 smallest만 list의
             smallest = only_number   #첫번째 원소로 초기화가 안되어 두개로 나누어주니 해결됨.. 왜지???
        if largest is None :
             largest = only_number

        if only_number > largest :
            largest = only_number
        if only_number < smallest :  #이것도 이상함. largest의 elif 밑에 바로 elif를 썼더니 왠지모르게 한번 값이 바뀐
            smallest = only_number   #이후로 더 작은 값이 나타나도 smallest가 변하지 않음..왜지

        print largestsmallestonly_number    # 값이 잘 들어가고 있나 확인을 위한 출력.
        i = i + 1
    except ValueError:
        print 'Invalid value'
        continue


print "Maximum is "largest
print "Minimum is "smallest
-------------END--------------


후기
1. 이번 수업에서는 프로그래밍에서 가장 중요한 반복문에 대해서 배웠다. while이나 for 모두 C에도 있는 문법이지만 파이썬에서 보니 느낌이 달랐다. while은 C나 python이나 아직은 큰 차이를 못느꼈으나, for은 'in'과 함께 쓰면서 훨씬 다양한 자료형들(list, tuple 등등)을 조건으로 유연하고 다양하게 활용될 수 있을 것 같았다. 
2. 'is', 'is not'연산자 또한 인상깊었다. 이 연산자들은 '=='(equal), '!='(not equal)로 쓰여도 상관없지만 인간의 언어로 표현함으로써 코드가 더 쉽고 편하게 읽히게 하는 역활을 할 것 같았다.
3. 이번 과제는 개념적으로는 어려운 문제가 아니었으나, 파이썬에 익숙하지 않음 + Pycharm(파이썬 IDE)에서의 알 수 없는 다양한 오류들로 인해 해결하는데 꽤 애를 먹었다.(문제푸는데 거의 2시간 좀 넘게 걸린듯..) 그래도 오랜만에 challenging한 문제를 만나(그만큼 공부를 열심히 안했었다는ㅜㅜ) 구글링도 열심히하고, 파이참 디버거 사용법도 익히고, 문제를 해결하는 즐거움도 느낀 유익한 시간이었다. 이번 문제 해결과정은 추후에 따로 포스트를 작성해야겠다. 여튼 재밌었음!


-------Week 7 정리 끝------


최종후기
 7주차 수업까지 들음으로 이로써 Coursera의 Python 수업 중 1단계인 'Python for everyone'을 수료하였다!! 프로그래밍적 개념 자체는 딱히 어렵진않았다. 이 수업을 통해 파이썬이 어떤 언어인지에 대해 대략적으로나마 알게되고 실제로 다양한 퀴즈들과 과제를 해봄으로써 파이썬의 실제적인 사용까지 익힐 수 있었던 매우 좋은 코스였다. 또한 이 수업은 기초부터 매우 친절하고 재밌게 설명해주어 프로그래밍을 아얘 모르는 초보라도 수강해면 매우 유익한 기회가 될 것이라고 생각했다. 하지만 매우 기초적인 내용을 다루고 있어 좀 더 실질적인 이해와 활용을 위해선 추가로 수업을 듣거나 여러 전자책들(ex : Jump to python)이나 Codeacademy에서 추가적인 공부를 해야겠다고 느꼈다. 처음으로 듣는 인터넷 영어강의였으나 교수님이 쉬운 영어로 설명해주시고, 영어자막도 있어 보통사람도 큰 무리없이 수강할 수 있을 것이다. 
만족도: ★★★★☆











'Python' 카테고리의 다른 글

Coursera_Python for everyone_Chapter 6.  (0) 2016.07.30
Coursera_Python for everyone_Chapter 5.  (0) 2016.07.28
Coursera_Python for everyone_Chapter 2 & 3 & 4  (0) 2016.07.26
Week 6. Functions.

' 함수 정의하기. '
- syntax
     def '함수명' (Parameter) :
          ~~~~

' Arguments '
- 함수에 대한 입력으로서 전달하는 값.
- 함수 호출할 때의 입력

' Parameter '
- A parameter is a variable which we use in the function definition that is a 'handle'
  that allows the code in the function to access the arguments for a particular function invocation.
- 함수 정의에 사용.

' Return Values '

Assignment
4.6 Write a program to prompt the user for hours and rate per hour using raw_input to compute gross pay. Award time-and-a-half for the hourly rate for all hours worked above 40 hours. Put the logic to do the computation of time-and-a-half in a function called computepay() and use the function to do the computation. The function should return a value. Use 45 hours and a rate of 10.50 per hour to test the program (the pay should be 498.75). You should useraw_input to read a string and float() to convert the string to a number. Do not worry about error checking the user input unless you want to - you can assume the user types numbers properly. Do not name your variable sum or use the sum() function.

def computepay(hr):
    if h > 40:
        pay = 40 * r + (h - 40) * r * 1.5

    else:
        pay = h * r
    return pay

try :
    hrs = raw_input("Enter Hours:")
    rate = raw_input("Enter Rate Per Hours : ")
    h = float(hrs)
    r = float(rate)
    p = computepay(hr)
    print p

except :
    print "please input numeric numbers"





후기

 함수라는 개념에 대한 기초중에 기초라 딱히 새롭거나 어렵지는 않았다. Parameter와 Argument의 정의를 내가 이해한게 맞는지는 잘 모르겠다. 나중에 정확히  두 개념의 정의와 차이에 대해 알아보고 정리해야겠다. 

Week 5. 정리노트


week 5 Conditional Statement 

' if '

' elif '

' else '

*indent : 들여쓰다.
-조건문은 들여쓰기(indentation)로 구분.

' indentation errors ' - 들여쓰기 할 때 tap이랑 space bar랑 섞어쓰면 안됨. 무조건 tap으로만.

' The try  / except Structure '. 예외처리 구문.
- 코드오류로 인해 프로그램이 죽는걸 방지.
- 오류가 날 가능성이 있는 코드들을 try 구문에 적음. 
- try가 실패할 시 실행할 코드들을 except에 적음.

- syntax
try:
     ~~~
except:
     ~~!@

Assignment 1.
      3.1 Write a program to prompt the user for hours and rate per hour using raw_input to compute gross pay. Pay the hourly rate for the hours up to 40 and 1.5 times the hourly rate for all hours worked above 40 hours. Use 45 hours and a rate of 10.50 per hour to test the program (the pay should be 498.75). You should use raw_input to read a string and float() to convert the string to a number. Do not worry about error checking the user input - assume the user types numbers properly.

-----CODE
try :
hrs = raw_input("Enter Hours : ")
h = float(hrs)

rate = raw_input("Enter Rate Per Hours : ")
r = float(rate)

except :
print 'please input numeric values'

pay = 0

if h < 40:
pay = r * h

else:
pay = 40 * r + (h - 40) * r * 1.5

print pay
-----CODE------

Assignment 2.
3.3 Write a program to prompt for a score between 0.0 and 1.0. If the score is out of range, print an error. If the score is between 0.0 and 1.0, print a grade using the following table:
Score Grade
>= 0.9 A
>= 0.8 B
>= 0.7 C
>= 0.6 D
< 0.6 F
If the user enters a value out of range, print a suitable error message and exit. For the test, enter a score of 0.85.

----CODE---
try:
    score = raw_input("Enter Score: ")
    s = float(score)
    if s >= 0.0 and s <= 1.0:
        if s >= 0.9:
            print 'A'

        elif s >= 0.8:
            print 'B'

        elif s >= 0.7:
            print 'C'

        elif s <= 0.6:
            print'D'

        else:
            print 'F'

    else:
        print 'please input appropriate numeric value(0.0~1.0)'


except:
    print 'please input appropriate numeric value(0.0~1.0)'

----CODE---



수업후기

이번 5주차에서는 제어문 중에서도 'if문들(if, elif, else)'과 파이썬에서의 예외처리 구문인 'try -- except'에 대해서 공부했다. if문들은 새로운 내용이 딱히 없었으나 try-except 문은 C에서 내가아는 수준에서는 몰랐던 내용이라 재밌게 들었다. 과제 2번에서 입력이 숫자가 아닐때의 예외처리를 하고싶어 처음에는

s = float(score) 

까지만 try문에 적었었다. 예상으론 숫자가 안들어오면 float으로 캐스팅 하는 것 자체가 안돼 바로 except 문으로 갈 줄 알았는데 다음 코드도 자동으로 실행되는지 s값이 존재하지 않는다는 오류가 뜨며 실행되지 않았었다. 그래서 그냥 전체 코드를 다 try문에 넣으니 이상없이 실행됬다. 첫번째 시도 떄 왜 안됬는지 아직도 잘 모르겠다.

3강, 4강 강의 들으면서 적었던 노트들


Week 2 & 3.
어떻게 인간은 문제를 해결하는가?
난 어떻게 이 문제를 해결할 것인가?
답이 중요한 것이 아님. 어떻게 생각하였나?
인간으로서 내가 문제를 푼 방법을 컴퓨터가 이해할 수 있게 바꿔주는 작업.

ex) 가장 큰 숫자 찾기.
-한자리수, 두자리수는 빠르게 무시. 자리수가 가장 큰 수들만 고려.
-세자리수의 백의자리 숫자들 비교.
-원소 하나하나를 모두 비교하여 가장 큰 숫자로 정하기
-찾은 수 보다 더 큰 수가 나왔다면 큰 수 갱신하기






소감
 3강까지는 아직 가볍게 프로그래밍에 대해 소개하는 내용이라 딱히 새로운 내용은 없었다. 그럼에도 문제해결에 관한 설명은 인상깊게 들었다. 컴퓨터 공부를 시작한지 1년 반 정도 되는 코딩 초심자로서의 '프로그래밍'이라는 것은 어떠한 문제를 해결할 때의 인간의 사고과정을 컴퓨터의 언어로 매우 정교하게 구체화하는 작업인 것 같다. 코딩을 배우기 전까지는 몰랐는데 이와같은 추상적인 과정을 실제적으로 구체화하는 '컴퓨팅적 사고'가 확실히 여러방면에서 도움이 될 수밖에 없겠구나라는 것을 공부하면 할수록 느낀다.


Week 4.
'Constants.' 상수.
- 변하지 않는 값. 숫자, 글자, 문자열 등
-'' or ""은 스트링 출력 떄 사용..
ex) print 159
     print 'hello world'   에서 159, hello world 가 상수.

'Variable' 변수.
- 변하는 값. 따로 설정할 수 있는 값.
ex) x = 12.2, y=14

변수 이름 지을 때 유의사항. ex) 숫자먼저 쓰지 않기. 예약어조심하기. 특수문자 쓰지 않기 등등.

'Numeric Expressions'
+ 더하기
- 빼기
% 나머지연산.remainder
...
** 제곱. power

'Operator Precedence Rules'
  1. () Parenthesis
  2. Power
  3. Multiplication
  4. Additon
  5. Left to Right

파이썬 2에서의 나눗셈
- 정수연산만 함. == 결과가 소수점으로 안나옴.

Integer와 Float number(소수)들이 섞여있으면 결과는 소수로  표현되어나옴.

Type 
- type(내용) == 내용의 타입을 알려줌.
type의 종류들 = string, integer, float...

concatenate 
- '연결하다'는 의미. 문자열의 연결
- ex) eee = 'hello ' + 'there'
        print eee ---> hello there 출력.

#Traceback, ERROR를 Scholding(꾸짖음)으로 생각하지말고 컴퓨터가 난 무지하니 전능하신 프로그래머께서 옳바른 해답을 제시해주기를 기다리는 것으로 생각해봐라 ㅋㅋ

'Type Conversions'
          다른 타입으로 캐스팅 할 수 있음.
 ex) int(), float()....
      print 99/100 ----> 0
      print float(99)100 ----> 0.99

'String Conversions'
String이 숫자들로만 이루어젔다면 String이라도 int or float으로 캐스팅할 수 있음. 문자가 포함되어있으면 ERROR!
ex) sval = '123'
     type(sval) ---> string
     ival = int(sval)
     type(ival) ---> integer

User Input.

'raw_input() 함수'
- C에서의 scanf랑 같은 역활. 사용자의 입력을 받아옴. String 타입으로 받아오기 때문에 제대로 사용하기 위해선 다른 형식으로 캐스팅해야 하는 경우가 자주 있음.
ex) u_name = raw_input('Please input your name : ')
     print 'Welcome', u_name
---C code
#include <stdio.h>
#pragma warning (disable :4996) //scanf 보안문제로 인한 오류 무시.

int main(){
        char u_name[50];

       scanf( "%s", &u_name);
       printf( "Welcome %s", u_name);

       
        return 0;
}

'Converting User Input'
유럽식 층 표기법 = 1, 0(입구), -1 ...
미국식 층 표기법 = 2, 1(입구), B1 ...
---- 유럽식 층 표기 -> 미국식 층 표기로 바꾸는 코드.
inp = raw_input('Europe floor : ')
usf = int(inp) + 
print "Us floor is "usf
##string인 inp를 int형으로 캐스팅.

'파이썬에서의 주석처리.'
- '#' 사용.

'String Operations'
print 'abc' '123'
print 'hi' 5

'Mnemonic Variable Names'
- Mnemonic : (기억을 돕는)연상기호. 
- 변수의 이름을 정할 때 기억이 잘되고 알아보기 쉬운 이름으로 지을것. 




소감
이번 4강에서는 기본적인 내용이긴 하지만 파이썬에 맞는 새로운 연산들과 함수를 배워 더욱 집중해서 들었다. 특히 파이썬의 문자열 연산 내용과 입력함수인 'raw_input()'을 잘 기억해놔야겠다.

 + 파이썬 예제코드를 C로 바꾸는 작업에서 겨우 한달 C언어를 안했을 뿐인데 기본적인걸 너무 많이 까먹어서 충격받았다.... 얼른 파이썬 기본과정 끝내고 파이썬 자료구조 수업 때 부터는 C 복습도 할겸 꼭 C언어로의 표현을 같이 정리해야겠다.
++ scanf 보안문제로 인한 에러떔에 빌딩안되는 것도 내가 scanf 사용법을 잘몰라서 그런줄 알았다... 이거땜에 시간 꽤 날림 ㅜㅜ C 복습도 꼭꼭 해야지..








--------------자기설계전공 합격!!!!-----------

이번년 1학기에 신청했던 심리 + 컴공 + 통계를 합해 내가 설계한 '기초인지공학'전공이 최종합격 됬다!!!!! 2학년 1학기부터 무대포로 일단 컴공수업을 다 듣고봤는데 허공에 날리는 학점이 되지않아 정말 다행이다. 이로서 인공지능에 대해 공부하려하는 내 목표에 조금이라도 더 가깝게 됬다. 9차학기까지 다녀야하고 매학기마다 엄청 빡세겠지만 그래도 공부하는게 좀 더 보람차고 재밌을 것 같다. 일이 하나 확실하게 해결된만큼 앞으로라도 게임 좀 줄이고 열심히 프로그래밍 + 통계 공부를 더 해야겠다. 합격해서 정말 기쁘다 열심히 살아야지




방학동안 혼자 공부하는 것도 좋지만 기록으로 남길 수 있는 공부를 하고싶어 무엇을 할 지 고민하다가 파이썬을 공부하기로 결정했다. 

파이썬 공부는 코드아카데미(https://www.codecademy.com/)에서 할지, 코세라(https://www.cousera.org/)에서 할지 고민하다가 풍부한 자료와 기초부터 차근차근 알려주는 코세라를 선택했다. 

 

오늘 첫 수업은 코세라에서 가장 유명한 파이썬 강의인 Python for everyone(https://www.coursera.org/learn/python)을 신청하여 1단원을 들었다. 영어로 수업하는데 어려운 표현도 잘 없고 영어자막도 있어 이해하는데 전혀 어려움이 없었다. 무엇보다 좋았던 점은 교수님이 내용을 설명해주는데 풍부한 예시와 재밌는 농담을 섞어 수업 내내 웃으면서 봤다.

 

내용적인 측면도 정리를 해보자면, Chapter 1. Why we Program? 단원 명 그대로다. 왜 우리가 프로그램을 하는지와 컴퓨터 하드웨어에 관한 아주 기초적인 설명이 주 내용이다. 이 course는 컴퓨터에 대한 지식이 없는 사람들을 대상으로 하기 때문에 매우 기초적인 내용부터 시작한다. 인상 깊었던 부분은 프로그래밍이란 무엇이며 왜 필요한가에 대해 설명해 주는데 컴퓨터 프로그래밍을 춤을 배우는 과정과 연결시켜 설명하는 부분이었다. 컴퓨터가 코드를 순서대로 실행하듯 인간도 춤을 배울 때 순서에 맞춰 한다는게 주 내용이었는데 이 내용을 옛날에 유행했던 마카레나 춤을 예시로서 사용했는데 이런 강의에서 마카레나 영상을 보니 강의가 더 친숙하게 느껴졌다. (마카레나 춤 주소 ㅋㅋ https://www.youtube.com/watch?v=vlzwuFkn88U). 또한 프로그래밍이라는 작업은 컴퓨터의 언어(파이썬)로 컴퓨터가 이해할 수 있는 한편의 이야기를 만드는 작업이라는 비유도 인상깊었다. 프로그래밍을 한편의 이야기를 만드는 작업이라 생각하니 코딩이 뭔가 더 낭만적이고 흥미로운 것으로 새롭게 느껴졌다. 

 오늘 들은 1강은 작년부터 C프로그래밍, 어셈블리, 자료구조 등등을 수강한 나에게 특별히 새로운 내용은 아니었지만 딱딱하고 어렵게 생각했던 코딩을 좀더 재밌고 부드러운 작업으로 새롭게 느끼게 해 준 수업이었다. 이번 주 중으로 2강도 들어야지!

 

 

총 7주차의 수업.

 

오 마케레나~

 

 

1주차 완료!

 

 

 

 

 

 

이번에는 정렬의 기본인 거품정렬(Bubble Sort) 문제를 풀어보았습니다!! 

 

기본이라지만 저에겐 역시나 어려웠습니다ㅠㅜ

 

프로그램 명: bubble
제한시간: 1 초

다음 애플릿은 버블 소트가 이루어지는 과정이다.

//// [동작보기 클릭] //////

데이터 수 , 스텝 수가 주어질 때 위와 같이 동작하도록 한 후 주어진 스텝 후의 배열의 상태를 출력하는 것이다.

예를 들어 7 개의 데이터가 주어지고 , 2 스텝 후의 상태는

             6 2 9 8 3 4 7
1 번째 스텝: 2 6 8 3 4 7 9
2 번째 스텝: 2 6 3 4 7 8 9

2 6 3 4 7 8 9 를 출력하면 된다.

입력

입력의

  • 첫 줄은 데이터의 개수 n, 스텝 수 s 가 주어진다. ( 1 <= s < n )
  • 다음 줄에는 n 개의 데이터가 입력으로 주어진다. 각 수는 -1000 에서 1000 사이 정수이다.

n 은 1000 이하의 양의 정수이다.

출력

s 스텝 후의 상태를 한 줄에 출력한다.

입출력 예

입력

7 2
6 2 9 8 3 4 7

출력

2 6 3 4 7 8 9

즉 min[i]로 1과 2, 2와 3, 이렇게 두개씩 묶어 비교하는 코드를 짜면 됩니다.

완성된 코드는 다음과 같습니다.

 

#include <stdio.h>
 int main(){
 

        int n, s, i;

        int sort[1000];
        int temp, count = 0;
 
        scanf("%d %d", &n, &s);
 
        for (i = 0; i < n; i++){
                 scanf("%d", &sort[i]);
        }
 
        while (count < s){
                 for (i = 0; i < n - 1; i++){
                         min = sort[i];
                         if (min > sort[i + 1]){
                                  temp = sort[i];
                                  sort[i] = sort[i + 1];
                                  sort[i + 1] = temp;
                                  }
                         }
                 count++;
                 }

         for (i = 0; i < n; i++){

                 printf("%d ", sort[i]);
        }
        
        return 0;
}

결과는??

 

 

 

 

 

통과~~

 

처음엔 밑과 같이 이중for문으로 풀려했으나, 그러면 안쪽 for문이 한바퀴 돈 뒤에 sort[0]부터 시작할 수가 없어 위의 코드와 같이

 

while-for문을 사용하여 문제를 풀었습니다.

        for (j = 0 ; j < s ; j++) {

                 for (i = j; i < n - 1; i++){

                         min = sort[i];
                         if (min > sort[i + 1]){
                                  temp = sort[i];
                                  sort[i] = sort[i + 1];
                                  sort[i + 1] = temp;
                                  }
                         }
                 }

 

 

 

 

기본적인 버블정렬도 2시간만에 코드를 짰습니다ㅠㅠ 앞으로도 갈길이 멀군요. 더욱 노력해야겠습니다

 

평평하게 하기 문제는 5단계임에비해 쉬운 편이라 한번에 해결하였습니다. 다른 분들도 문제를 읽어보시면 쉽게 해결하실 수 있을 것이니 따로 자세히 적지는 않겠습니다.

 

---- 문제 -----

프로그램 명: box_brick

밥은 벽돌 쌓기놀이를 좋아한다.

"봐!! 내가 벽을 만들었어" 그는 누이 앨리스에게 이야기 했어. 그러자 누이는 "벽돌의 높이가 같아야지 제대로 된 벽이지"라고 되받았어.

밥이 곰곰 생각해보니 그녀의 말이 맞는 것 같아 높이를 같게 하기위해 벽돌을 하나하나 옮기기 시작했어.

밥은 게을러서 최소한의 벽돌을 옮겨서 같은 높이를 맞추기를 원해. 밥을 도와 줄수 있겠니?

입력

첫수는 벽돌 무더기의 수 n ( 1 <= n <= 50 ) 이고 , 다음 n 수는 각 무더기의 벽돌의 수(벽돌의 높이) hi 이다. 각 hi 는 1 에서 100 사이이다.

높이를 같이 맞출수 없는 데이터는 입력으로 주어지지 않는다.

출력

아래와 같은 형식으로 출력한다.

The minimum number of moves is k.

입출력 예

입력

6
5 2 4 1 7 5

출력

The minimum number of moves is 5.

보충 설명

출처:Southwestern European Regional Contest 1997

--- 해석 ---

이 문제는 즉 (블럭의 총 갯수 / 무더기의 개수)로 평균 갯수를 구하여 ( 평균보다 많은 블럭 갯수 - 평균 ) 를 출력하면 

되는 간단한 문제입니다.

 

 

--- 코드 ---

 

#include <stdio.h>
 
int main(){
        
        int a; //벽돌 무더기 수.
        int x[50], sum = 0, avg, sub = 0; //각 무더기의 갯수, 총 벽돌 수, 평균,   이동해야하는 벽돌 수.
        scanf("%d", &a);
 
        for (int i = 0; i < a; i++){
                 scanf("%d", &x[i]);                       //각 무더기의 갯수 입력.  scanf("%d", x + i)이렇게 써도 됨.
                 sum += x[i];                              // 총 벽돌 갯수
        }
        avg = sum / a;           
 
        for (int i = 0; i < a; i++){

                 if (x[i] - avg > 0) sub += (x[i] - avg);  //양수인 것만 더해줌 == 이동해야하는 벽돌

        }
 
        printf("The minimum number of moves is %d.", sub);
 
        return 0;
}

이상입니다~!

 

 

2번째 과제인 최대수 연결문제... 개인적으론 정말 어려웠습니다..ㅋㅋㅋㅋㅋ헣 최대수 연결문제는 다음과 같습니다.

 

두 양의 정수가 주어질 때 두 수의 길이는 다음과 같이 약속

  • 앞수에서 뒤수를 빼가는 과정을 반복.
  • 뺀 값이 음수이면 종료 아니면 반복

예를 들어 , 두 수가 5 3 이면

5 3 2 1 1 0 1

5 3 의 길이는 이어지는 수의 개수 7 .

n 이 입력으로 주어질 때 두 번째수를 1 , 2 , .. n 으로 줄 때 최대 길이를 구하는게 문제이다.

n 이 5 이면

  • 5 1 4
  • 5 2 3
  • 5 3 2 1 1 0 1
  • 5 4 1 3
  • 5 5 0 5

최대 길이는 5 3 일 때 7 이다.

입력

n 은 1000 이하의 자연수이다.

출력

최대 길이를 출력한다.

입출력 예

입력

5

출력

7

어제 소인수분해 문제를 푼 경험을 바탕으로 하나의 숫자를 정해 자세히 분석하였으나 빨리 이해되지는 안더군요ㅜㅜ 그래도 내가 

휴리스틱으로 쉽게 계산한 것을 하나하나 정리하여 그것을 코드로 정리하면 문제를 풀 수 있다는 진리를 바탕으로 다음과 같이 첫 코드를 짰습니다.

 

#include <stdio.h>
 
int main(){
 
        int a, b, temp, x, y = 1, MAX = 0;
        long double c[1000][10000] = { 0 }; //2차원배열로 각 경우의 길이 저장.
        int i = 0, j = 0;
 
        scanf("%d", &x); 
 
        a = x;
                 for (i = 0; i < x; i++){
                         j = 0;
                         b = y;
                         while (a - b >= 0){
                                  c[i][j] = a - b;
                                  temp = a;
                                  a = b;
                                  b = temp - b;
                                  j++;
                         }
                         y++;
                 }
        

        MAX = sizeof(c) / sizeof(c[0]); //행렬 c의 row의 원소 갯수 구하기.

        for (i = 1; i < x; i++){
                 if (sizeof(c) / sizeof(c[i - 1]) < sizeof(c) / sizeof(c[i])){
                         MAX = sizeof(c) / sizeof(c[i]);
                 }
        }
 
        printf("%d", MAX);
 
 
        return 0;
}

 

하하... 보이시는대로 쓸데없이 복잡하기만하고 돌아가지도 않는 똥을 창조하였습니다.. ㅋㅋㅋ 그러나 이렇게 만드는데도 몇시간 걸렸다는게

함정.. 하하

완전 열심히 만들었는데 이름은 겁나 많이 들었지만 개인적으론 처음보는 stackoverflow 때문에 아무리 코드를 수정해도 빌드도, 당연히 

디버깅도 안되서 2시간 반이 지나서야 미련을 버리고 코드를 싹 밀어버렸습니다ㅜㅜ 

(대체 왜그런걸까요? 심심할 때 stackoverflow 구체적으로 찾아봐야지)

 

절망은 잠시 뒤로한체 후배들과 제 집에서 맜있는 카레 밥과 카레 라면까지 4명서 총 8인분을 먹고나니 다시 시작할 힘이 생기더군요.

전 코드를 밀고 다시 천천히 생각해보니 꼭 2차원 배열을 쓸 필요는 없다고 생각이 들더군요. 그래서 다음과 같이 코드를 짰습니다.

 

 

#include <stdio.h>
 
int main(){
 
        int a, b = 1, c;
        int x = 0, y, temp = 0, count = 0, MAX[1000], M;
 
        scanf("%d", &x);
 

        MAX[0] = 0; //y가 1부터 시작하기 때문에 딱히 값이 들어갈 경우가 없어서 따로 초기화.

        a = x;
        c = a - b;
        for (y = 1; y <= x; y++){
                 c = x - y;

                 a = x; //while문 안에서 바뀐 a 값 초기화

                 b = y; //while문 안에서 바뀐 b 값을 y에 맞춰 하나씩 증가하게 함.

                 count = 0; //count 초기화를 해 y가 바뀔때마다 다시 셈.

                 while (c >= 0){
                         count++;
                         temp = a;
                         a = b;
                         b = temp - b;
                         c = a - b;
                 }
                 MAX[y] = count; // 각 경우의 길이들을 배열에 담아줌.
                 if (MAX[y] > MAX[y - 1]){  //배열의 원소들을 비교해 제일 큰 값만 저장.
                         M = MAX[y];
                 }
        }
 

        printf("%d", M+2); //문제가 처음 입력받는 수와 y를 포함하여 세기 때문에 +2를 해줌.

 
 
        return 0;
}

결과는??????????????

하하ㅏㅎ하하하하하하ㅏ핳하ㅏ핳하하하하하ㅏㅎ하하하ㅏ하 정말 너무 기뻤습니다 하하하ㅏㅏㅜㅜㅜㅠㅠㅜ

오늘 하루종일 고민했던 문제를 혼자힘으로 풀다니ㅜㅠㅜㅜㅜㅜ으어어ㅜㅜㅜ 행복합니다ㅠㅜㅜ

 

2번 문제를 풀면서 뭔가 이런 방향으로 하는게 맞는 것 같은데 답이 애매하게 안나온다면, 한단계 씩 디버깅을 꼭꼭꼭꼭!!!!

하자는 교훈을 얻었습니다. 여태까진 겁나 쉬운 문제밖에 안풀어서 (물론 이것도 그런축에 속하는 것 같긴 하지만..ㅠ) 디버깅을 따로 안써도 해결됬는데

이번문제는 정말 디버깅의 도움을 많이 받았습니다. 

결국 2번 문제 결론 ------- 디버깅 차냥해~

 

 

 

+ Recent posts