Baekjoon 문제 풀기 (1110번 : 더하기 사이클) Python

1110번 : 더하기 사이클

1. 문제읽기


형변환을 자유자재로 할 수 있는지..?

문제를 이해하는 것은 어렵지 않았다.
문제를 딱 읽고 문자열의 덧셈! int의 덧셈! 의 특징들이 딱 기억나면서 접근하는 것은 쉬웠는데, 로직을 만들어내는게 너무 어려웠다.

2. 제출 코드


어떻게 문제를 풀지는 알겠는데, 무한루프에서 탈출하는 것이 힘들었다.
문제를 풀 때 힘들었던 점을 정리해본다.

1) while문 집착

개인적으로 while문에 조건을 넣는 방법을 좋아해서 고집을 부려서 조건문을 while문에 계속 달아줬는데, 예제 4번에서 0을 입력하기 때문에 while문에 아래 if문의 조건을 넣으면 count가 0이 되어버린다.
간단하게 while 1: 을 하고, 아래에 if문으로 조건을 달면 해결이 된다.
다른 방법으로는 초기화를 할때 문제 조건에서 벗어나는 수로 (예를 들면 -1) 초기화를 하는 것이다.
항상 조건을 간과하고 지나치는 점이 있는데 고쳐야겠다.

2) “01” != “1”

나는 코드를 짤 때 모든 변수를 문자열로 만들어서 풀었는데 기존 num과 새로운 수 new_n이 같다는 조건에서는 int형으로 바꿔주여야 문제가 해결이 되었다.
new_n = num 을 예제 1번과 2번은 만족시켰지만 3번에서는 “01”과 “1”으로 만족시킬 수 없기 때문에 무한루프가 계속 돌아갔다.
파이썬 튜터를 돌리면서 겨우 알아냈다.

3) 한자리 수일 때

처음에 문제에서 주어진 수가 10보다 작다면 앞에 0을 붙여 두자리 수로 만든다고 주어졌는데도 불구하고, 생각했을 때 그다지 필요 없는 것 같아서 이 조건을 무시하고 지나갔다.
예제 1, 2번은 잘 넘어갔지만 예제 3, 4번을 시도해볼 때 이 조건이 문제가 된다는 것을 알아내었다.
역시 문제에서 조건은 괜히 주어지지 않는다…

4) n과 num과 new_n

반복문을 탈출하는 조건인 처음 수와 새로운 수가 같아질 때를 자꾸 num == new_n 으로 코드를 짰다.
나중에가서는 n과 num과 new_n이 자꾸 헷갈려서 first_num도 만들어내고 난리가 났었다.
몫과 나머지로 문제를 다시 풀어보는 과정에서 바보같이 헷갈려했던 것이 기억이 나서 부랴부랴 정리를 추가한다.
처음 수는 n이고 새로운 수는 new_n이기 때문에, 조건을 n == new_n으로 하면 된다!!!

n = input()
num = n
new_n = 0
count = 0


while 1:
    if int(n) < 10:
        n = "0" + n
    new_n = n[-1]+str(sum(map(int,n)))[-1]
    n = new_n
    count += 1
    if int(new_n) == int(num):
        print(count)
        break

3. 공부할 것


다른 코드를 보니 역시나 자주 쓰이는 몫과 나머지를 쓰는 코드가 많이 보였다.
앞자리 수, 뒷자리 수를 봤을 때 나는 문자열 밖에 생각나지 않았는데, 몫과 나머지로도 충분히 가능했다.
문자열과 숫자 형변환으로 고통받지 않아도 돼서 더 쉽게 풀 수 있었을 것 같다.
다음에 풀 때 기억이 날지 모르겠지만, 이 방법으로 풀어봐야겠다.

n = int(input())
num = n
new_n = -1
count = 0

while 1:
    num1 = num//10  # 기존 수의 앞자리수
    num2 = num%10  # 기존 수의 뒷자리수
    new_n = num2*10 + (num1+num2)%10
    count += 1
    if n == new_n:
        print(count)
        break
    num = new_n

댓글남기기