첫째 마당 복습 ~ 06-3 (p.266 ~ p.277)

 

드디어 첫째 마당을 끝내고 둘째 마당에 돌입했다. 이 책의 여정도 거의 끝나간다.

문법을 다 배우고 이제 프로그램을 어떻게 작성해야 할지 막막했는데, 둘째 마당에서는 이러한 독자들의 고충을 잘 이해하고 프로그램 작성 방식을 차근차근 알려준다. 다시 생각해도 이 책으로 사길 잘한 것 같다!

 

잘했어 과거의 나!

 


 

6장 : 파이썬 프로그래밍, 어떻게 시작해야 할까?

 

6장에서는 짤막한 스크립트(에디터로 작성한 파이썬 프로그램 파일)와 함수를 만들어 보면서 프로그래밍 감각을 키운다.

 

06-1 내가 프로그램을 만들 수 있을까?

 

문법을 어느 정도 익혔지만 프로그램을 작성하는 것에 자신이 없다면 다른 사람들이 만든 프로그램 파일을 자세히 들여다보도 분석하는 것이 좋다. 그러다 보면 자신만의 새로운 아이디어가 떠오를 수도 있다.

하지만 여기에서 가장 중요한 것은 자신의 수준에 맞는 소스를 찾는 것이다.

처음에는 구구단 프로그램을 작성해 보자.

* 프로그램을 만들려면 가장 먼저 '입력'과 '출력'을 생각하라.

 

구구단 프로그램
함수 이름은? : GuGu
입력받는 값은? : 2
출력하는 값은? : 2단(2, 4, 6, 8, ..., 18)
결과는 어떤 형태로 저장? : 연속된 자료형이므로 리스트

 

1. 먼저 이렇게 입력한다. GuGu라는 함수에 2를 입력값으로 주면 result라는 변수에 결괏값을 넣으라는 뜻이다.

result = GuGu(2)

 

 

2. 이제 결괏값을 어떤 형태로 받을 것인지 고민해 본다. 2단이니까 2, 4, 6, ..., 18까지 갈 것이다.

이런 종류의 데이터는 리스트 자료형이 딱이다. 따라서 result = [2, 4, 6, ..., 18] 같은 결과를 얻는 것이 좋겠다는 생각을 먼저 하고 나서 프로그래밍을 시작하는 것이 필요하다.

 

3. 어떻게 만들지 생각해 봤으니 1번에서 입력한 문장은 지우고 진짜 프로그램을 짜 보자. 일단 이름을 GuGu로 지은 함수를 다음과 같이 만든다.

def GuGu(n):
    print(n) # 실행하면 2를 출력

 

4. 이제 결괏값을 담을 리스트를 하나 생성하자. 앞에서 작성한 print(n)은 입력이 잘되는지를 확인하기 위한 것이므로 지워도 좋다.

def GuGu(n):
    result = []

 

5. 다음으로 result에 2, 4, 6, ..., 18을 어떻게 넣어야 할지 생각해보자.

def GuGu(n):
    result = []
    result.append(n*1) # append 내장 함수 사용
    result.append(n*2)
    result.append(n*3)
    result.append(n*4)
    result.append(n*5)
    result.append(n*6)
    result.append(n*7)
    result.append(n*8)
    result.append(n*9)
    return result
print(GuGu(2))
>>> [2, 4, 6, 8, 10, 12, 14, 16, 18]

 

6. 하지만 위 함수는 반복이 너무 많다. 가만 보면 result.append(n*'숫자')의 '숫자' 위치에 1부터 9까지 숫자만 다르게 들어가 있다는 것을 알 수 있다. 똑같은 일을 반복할 때는 '반복문'을 사용한다고 했다. 그렇다면 1부터 9까지 출력해 주는 반복문을 만들면 되지 않을까?

def GuGu(n):
    result = [] # 결괏값을 저장할 리스트 result
    i = 1
    while i < 10:
        result.append(n * i)
        i = i + 1
    return result
    
print(GuGu(2))
>>> [2, 4, 6, 8, 10, 12, 14, 16, 18]

* 프로그래밍을 할 땐 매우 구체적으로 접근해야 머리가 덜 아프다.

 

06-2 3과 5의 배수 합하기

 

문제 : 10 미만의 자연수에서 3과 5의 배수를 구하면 3, 5, 6, 9이다. 이들의 총합은 23이다. 1000 미만의 자연수에서 3의 배수와 5의 배수의 총합을 구하라.

 

입력하는 값은? : 1부터 999까지(1000미만의 자연수)
출력하는 값은? : 3의 배수와 5의 배수의 총합
생각해 볼 것은? : 1. 3의 배수와 5의 배수는 어떻게 찾지?
                                        2. 3의 배수와 5의 배수가 겹칠 때는 어떻게 하지?

 

1. 먼저 1000 미만의 자연수는 어떻게 구할 수 있을지 생각해 보자. 다음과 같이 변수에 초깃값 1을 준 후 루프를 돌리며 1씩 증가시켜서 999까지 진행하는 방법이 가장 일반적인 방법일 것이다.

n = 1
while n < 1000:
    print(n)
    n += 1

또는 다음과 같이 좀 더 파이썬다운 range 함수를 사용할 수도 있다.

for n in range(1, 1000):
    print(n)

 

2. 1000까지의 자연수를 차례로 구하는 방법을 알았으니 3과 5의 배수를 구하는 방법을 알아보자.

1부터 1000까지의 수 중 3으로 나누었을 때 나누어 떨어지는 경우, 즉 3으로 나누었을 때 나머지가 0인 경우가 바로 3의 배수이다.

for n in range(1, 1000):
    if n % 3 == 0:
        print(n)
# 5의 배수도 동일한 방법으로 작성

 

3. 이러한 내용을 바탕으로 최종 작성하면 다음과 같다.

result = 0
for n in range(1, 1000): # 1부터 999까지 n에 대입하며 반복
    if n % 3 == 0 or n % 5 == 0: # n을 3으로 나눈 나머지가 0이거나 n을 5로 나눈 나머지가 0이라면
        result += n
print(result)

이 문제에는 한 가지 함정이 있는데 3으로도 5로도 나누어지는 15와 같은 수를 이중으로 더해서는 안 된다는 점이다.

따라서 15와 같이 3의 배수도 되고 5의 배수도 되는 값이 이중으로 더해지지 않기 위해 or 연산자를 사용하였다.

 

06-3 게시판 페이징하기

 

문제 : 게시물의 총 건수와 한 페이지에 보여 줄 게시물 수를 입력으로 주었을 때 총 페이지 수를 출력하는 프로그램을 작성하라.

 

함수의 이름은? : getTotalPage
입력받는 값은? : 게시물의 총 건수(m), 한 페이지에 보여 줄 게시물 수(n)

출력하는 값은? : 총 페이지 수

 

1. 총 건수(m)를 한 페이지에 보여 줄 게시물 수(n)로 나누고 1을 더하면 총 페이지 수를 얻을 수 있다.

총 페이지 수 = (총 건수 / 한 페이지당 보여 줄 건수) + 1

 

2. 이러한 공식을 적용했을 경우 총 페이지 수가 표의 값처럼 구해지는지 확인해 보자(m을 n으로 나눌 때 소수점 아래 자리를 버리기 위해 / 대신 // 연산자 사용)

def getTotalPage(m, n):
    return m // n + 1
    
print(getTotalPage(5, 10)) # 1이 출력
print(getTotalPage(15, 10)) # 2가 출력
print(getTotalPage(25, 10)) # 3이 출력
print(getTotalPage(30, 10)) # 3이 출력되어야 하는데 4가 출력

 

3. 실패 케이스는 총 게시물 수와 한 페이지에 보여 줄 게시물 수를 나눈 나머지 값이 0이 될 때 발생함을 유추할 수 있을 것이다. 이 실패 케이스를 해결하려면 다음과 같이 코드를 변경해야 한다.

def getTotalPage(m, n):
    if m % n == 0:
        return m // n # 나누었을 때 나머지가 0인 경우는 몫만 돌려줌
    else:
        return m // n + 1

print(getTotalPage(5, 10))
print(getTotalPage(15, 10))
print(getTotalPage(25, 10))
print(getTotalPage(30, 10))

 

+ Recent posts