게시물을 작성하면서 복습하는 문제를 선정하는 기준은<solved.ac 티어 브론즈 1 (Bronze1) 이상>입니다.
※ 본 사진과 해당 게시글 내용의 문제 모두 백준 : 온라인 저지[Baekjoon_OnlineJudge]사이트에서 발췌해왔습니다.
<문제>
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의 사이클 길이를 출력한다.
<예제 입출력>
26 | 4
55 | 3
1 | 60
0 | 1
71 | 12
메모리 : 29200KB
시간 : 68ms
해당 케이스는
나머지연산자와 정수 몫연산자를 활용해서 해결을했는데
10의 자리는 10으로 나눈 값의 몫에 해당하고
1의 자리는 10으로 나눈 나머지에 해당하는 점을 활용해서 루프문으로 작성했습니다.
보편적으로 많은 분들이 해당 방법으로
간결하게 해결한 것 같았습니다!
num = int(input())
n = num # while문 첫 싸이클에 들어갈 변수 설정
cycle = 0
# //연산자와 %연산자로 앞, 뒤 숫자 구분
while True:
a = n//10 # 10으로 나눈 몫 -> 앞자리 숫자 _ 한자릿수일 경우 자연스레 0이 됨.
b = n%10 # 10으로 나눈 나머지 ->뒷자리의 숫자가 옴
k = (a+b)%10 # 두 수의 합값의 뒷자리 숫자
n = (b*10)+k # 기존 뒷자리 수를 앞자리로 & 1의자리에 k
cycle += 1
if(n == num) :
break
print(cycle)
메모리 : 29200KB
시간 : 68ms
해당 케이스는 문자열(str
)을 활용해서 해결했습니다.
글자로 나누어 각 자리수를 분리하고
다시 int타입으로 변환해서 합을 구한 후 조건문을 구현했습니다.
num = str(input())
n = num
i = 0
if len(num) == 1 : # 한 자리 숫자일 경우 대비
a, b = 0, num # 0으로 대체
else :
a, b = num[0], num[1]
while True :
k = int(a) + int(b) # 각 자릿수 합
if k >= 10 : #합이 만약 10이 넘으면
k = str(k)[1] # 뒷자리 숫자만 가져오기
else :
k = str(k) #한자리면 그대로 사용
n = f"{b}{k}" # (입력값의 뒷자리)(합의 뒷자리) _ex. 26 -> 68, 1 -> 11
#두번째 사이클부터 계산이 맞게끔
# 'bk'가 처음의 'ab'와 같은 역할을 수행해야하기 때문에
a = b
b = k
i += 1
if int(num) == int(n) :
break
print(i)
새로운 코드가 있을까 검색해보았지만 대부분 유사한 풀이여서 넘어가도록 하겠습니다!