https://www.acmicpc.net/problem/1110
문제는 이렇게 되어 있다.
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.
일단 이렇게 생각하게 된다.
예를 들어서 26이 주어진 수라면 x=6, y=8이라서 첫 사이클 뒤의 새로운 주어진 수는 68이다.
이렇게 한 뒤에 하나의 사이클이 끝날 때마다 카운터에 1을 더해준다.
c+=1
m=-1 # 주어진 수를 변환한 값을 저장해서 처음 입력한 수와 동일한지 비교할 변수. 초깃값은 0부터 99 사이의 주어진 수와 항상 다르도록 지정
c=0 # 카운터의 초깃값
n = eval(input("정수를 입력하시오: "))
m1=n
while m!=n:
x1 = m1%10 #앞자릿수는 처음 수의 뒷자릿수
# 뒷자릿수는 각 자릿수를 더한 값의 가장 오른쪽자릿수
y1 = ((int(m1/10))+(m1%10))%10
m1=(x1*10+y1)
c+=1
m=m1
#print(m,c)
print(c)
문제 자체를 푸는 건 어렵지 않았다. 가장 큰 난관은 문제를 잘못 읽었다는 점에 있었다.
먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다.
이것을 '뒤에' 0을 붙여 두 자리 수로 만든다고 오해하면서 당분간 혼란에 빠졌다.
문제에 나온 예시를 보면 26을 입력하면 4, 55를 입력하면 3, 1을 입력하면 60회 만에 끝난다는 결과가 출력되어야 한다.
26을 입력한 결과의 출력은 어려움이 없었다.
중간 과정을 점검하기 위해 연산 과정을 모두 출력시켜 보았는데 최종 결과만 출력되도록 바꾸어 보면 이렇다.
55를 입력하면 어떻게 되어야 할까?
우선 5+5=10이니까 5와 0을 이어서 첫 번째 주어진 수는 50이 된다.
그리고 5+0=5니까 0과 5를 이어서 두 번째 주어진 수는 5가 된다.
마지막으로 0+5는 5니까 5와 5를 이어서 세 번째 주어진 수가 55가 되어서 연산이 종료된다.
완성한 코드를 다른 코딩테스트 채점 사이트처럼 함수 형식으로 바꾸어서 위의 채점 사이트에 제출해 보았는데 계속 틀렸다고 떴다.
def adding_cycle(n):
m=-1
c=0
m1=n
while m!=n:
x1 = m1%10 #앞자릿수는 처음 수의 뒷자릿수
# 뒷자릿수는 각 자릿수를 더한 값의 가장 오른쪽자릿수
y1 = ((int(m1/10))+(m1%10))%10
m1=(x1*10+y1)
c+=1
m=m1
return c
내가 그 사이트에 문제풀이 입력하는 방법을 잘 모르는 것 같은데... 일단 제출방법을 다시 살펴보았다.
그러니까 '첫째 줄'에서 input이 작동하고, 둘째 줄에는 결과가 출력되는 형식으로 하라는 것 같다.
첫째 줄에 '정수를 입력하시오: ' 같은 말이 나오면 안 되고 그냥 숫자를 입력할 수 있도록 커서만 있으면 되고, 그걸 입력한 뒤에는 둘째 줄에 결과가 나와야 한다는 것.
코드를 그렇게 바꾸어서 다시 입력해보았다.
m=-1 # 주어진 수를 변환한 값을 저장해서 처음 입력한 수와 동일한지 비교할 변수. 초깃값은 0부터 99 사이의 주어진 수와 항상 다르도록 지정
c=0 # 카운터의 초깃값
#n = eval(input("정수를 입력하시오: "))
n = eval(input(""))
m1=n
while m!=n:
x1 = m1%10 #앞자릿수는 처음 수의 뒷자릿수
# 뒷자릿수는 각 자릿수를 더한 값의 가장 오른쪽자릿수
y1 = ((int(m1/10))+(m1%10))%10
m1=(x1*10+y1)
c+=1
m=m1
#print(m,c)
print(c)
그리고 맞다고 채점되었다. ㅋㅋㅋ