알고리즘 입문
개념 배우기직접 풀어보기
놀면 뭐 하니,
그냥 하는거야.

직접 풀어보자! 반복과 누적 5문제

코딩냥

안녕, 나 코딩냥이다냥! 오늘 문제는 다섯 개라냥. 앞의 셋은 배운 걸 하나씩 확인하는 것이고, 뒤의 둘은 여러 개를 엮어야 풀린다냥. 순서대로 가자냥.

막혔을 때 제일 좋은 방법

개념 페이지에서 쓴 것처럼 표를 그려보자냥. 한 바퀴마다 변수가 어떻게 변하는지 손으로 서너 줄만 적어보면, 머리로만 씨름할 때보다 훨씬 빨리 보인다냥.

미션 1·1부터 n까지의 합7분

n 을 입력받아 1부터 n까지 모두 더한 값을 출력하는 문제다냥.

문제 풀러 가기

range(n) 이 아니라 range(1, n + 1) 이라냥. +1 을 빠뜨리면 n 이 빠져서 답이 딱 n 만큼 모자라게 나온다냥.

답이 조금 작게 나오면 이걸 제일 먼저 의심하자냥.

n = int(input())

total = 0
for i in range(1, n + 1):
    # 여기서 total 에 더한다냥
    pass

print(total)
미션 2·팩토리얼7분

n 을 입력받아 1부터 n까지 모두 곱한 값을 출력하는 문제다냥.

문제 풀러 가기

1번과 뼈대가 똑같다냥. 딱 두 군데만 다르다냥.

  • 상자 시작값: 0 이 아니라 1
  • 갱신: + 가 아니라 *

시작값을 0으로 두면 답이 무조건 0이 나온다냥.

n = int(input())

result = 1
for i in range(1, n + 1):
    # 여기서 result 에 곱한다냥
    pass

print(result)
미션 3·카운트다운7분

n 부터 1까지 거꾸로 출력하는 문제다냥.

문제 풀러 가기

range 의 세 번째 자리에 음수를 넣으면 거꾸로 간다냥.

range(n, 0, -1) 은 n부터 시작해서 0 직전까지, 1씩 빼면서 간다냥. 0 직전까지니까 마지막은 1 이라냥.

출력 형식을 문제에서 확인하자냥. 한 줄씩인지 한 줄에 모아서인지에 따라 print 쓰는 법이 달라진다냥.

n = int(input())

for i in range(n, 0, -1):
    pass
미션 4·각 자리 숫자의 합12분

숫자를 입력받아 각 자리 숫자를 모두 더한 값을 출력하는 문제다냥. 1234 면 1+2+3+4 라서 10 이라냥.

문제 풀러 가기

개념 페이지의 사탕 꺼내기를 그대로 쓰면 된다냥.

  • n % 10 으로 맨 뒤 자리를 꺼내 더하고
  • n // 10 으로 그 자리를 버린다냥
  • n 이 0이 될 때까지 while 로 반복한다냥

문자열로 바꿔서 푸는 방법도 있다냥. 먼저 while 로 풀어보고, 다 풀었으면 문자열 방법으로도 한 번 짜보면 좋다냥. 두 방법을 다 아는 게 중요하다냥.

n = int(input())

total = 0
while n > 0:
    # 맨 뒤 자리를 더하고, 그 자리를 버린다냥
    pass

print(total)
미션 5·n번째 피보나치 수15분

오늘의 마지막이자 제일 어려운 문제다냥. 앞의 두 수를 더해 만든 수열의 n번째 값을 구한다냥.

문제 풀러 가기

상자가 두 개 필요하다냥. 그리고 갱신은 반드시 한 줄로 해야 한다냥.

a, b = b, a + b     # 맞다냥

두 줄로 쪼개면 a 가 먼저 바뀌어서 틀린 답이 나온다냥.

주의시작값과 횟수를 꼭 확인하자냥

피보나치는 문제마다 1번째가 무엇인지가 다르다냥. 어떤 데선 1, 1 로 시작하고 어떤 데선 0, 1 로 시작한다냥.

문제의 예시 입력과 출력을 보고 맞춰야 한다냥. 로직이 맞아도 시작값이나 반복 횟수가 한 칸 어긋나면 오답이 된다냥. 예시로 손 계산을 꼭 해보자냥.

n = int(input())

a, b = 1, 1
# 몇 번 돌아야 하냥? 예시로 확인하고 정하자냥

print(a)

다 풀었냥?

코딩냥

1번과 2번이 사실상 같은 코드였다는 걸 봤냥? 시작값과 연산자만 바꿨을 뿐이라냥. 알고리즘은 이렇게 같은 뼈대를 조금씩 비틀어 쓰는 일이 많다냥.

스스로 점검해보자냥

  • 다섯 문제를 전부 채점기에서 통과했냥?
  • range(1, n + 1) 에서 +1 이 왜 필요한지 설명할 수 있냥?
  • 합은 0, 곱은 1로 시작하는 이유를 규칙이 아니라 이유로 말할 수 있냥?
  • while 을 써야 하는 상황과 for 로 충분한 상황을 구분할 수 있냥?
코딩냥

여기까지 오면 문제를 봤을 때 "아, 이건 훑으면서 쌓는 거네" 하는 감이 슬슬 잡힐 거다냥. 그 감이 알고리즘 공부의 진짜 재산이라냥. 다음 시간엔 정렬을 배워서 "가장 큰 값" 말고 "두 번째로 큰 값" 같은 것도 찾아본다냥. 가보자냥~