2 minute read

백준 문제 중 1110번

https://www.acmicpc.net/problem/1110

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자. 26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다. 위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다. N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다. —

풀이

Solution1

문자열 조작

a = input()

if len(a)==1: #한자리수가 들어왔을때 0추가
    a='0'+a


b = int(a[0]) + int(a[1])
a = a[1] + str(b%10) #10이상일때 나머지만 취하기
print(a)

b = int(a[0]) + int(a[1])
a = a[1] + str(b%10)
print(a)
9
99
98

input 값이 string임을 이용해 문자열의 index로 문자열을 직접 조작해 문제에 조건에 맞는 수로 변환했고 반복해봤습니다.

a = input()
count = 0

if len(a)==1:
    a='0'+a

origin = a #비교를 위해 저장

while True:
    b = int(a[0]) + int(a[1])
    a = a[1] + str(b%10)
    count+=1
    print(a, origin)
    if a == origin: #무한반복 탈출조건
        break
    if count==1000: #1000번 시행에도 못찾을 경우 탈출
        print('fail')
        break

print(count)
2
22 02
24 02
46 02
60 02
06 02
66 02
62 02
28 02
80 02
08 02
88 02
86 02
64 02
40 02
04 02
44 02
48 02
82 02
20 02
02 02
20

문자열이 조작이 끝난값과 입력받은 값을(한자리라면 0추가) 비교하기 위해서 origin이라는 변수에 저장하고 반복문을 실행 했습니다.

속도 68ms 메모리 29200kb

Solution2

// 연산과 % 연산으로 숫자 쪼개기

num = int(input())

numleft = num//10
numright = num%10
numsum = (numleft + numright)%10

num = numright*10+numsum

print(num)

numleft = num//10
numright = num%10
numsum = (numleft + numright)%10

num = numright*10+numsum

print(num)
26
68
84
num = int(input())
origin = num
count = 0
print(f'{num:0>2}',count)

while True:
    numleft = num//10
    numright = num%10
    numsum = (numleft + numright)%10

    num = numright*10+numsum
    
    count+=1
    print(f'{num:0>2}',count)

    if num==origin:
        break
    if count== 1000:
        break
26
26 0
68 1
84 2
42 3
26 4

fstring 으로 한자리수 앞 0 추가를 구현했고 //, % 연산자로 자릿수 조작을 구현했다

속도 72ms 메모리 29200kb

배운점

  1. 문자열 조작이 속도면에서 조금 더 빨랐다.
  2. 문자열은 immutable 값이라 인덱스로 직접 수정이 불가능하다.

Leave a comment