[알고리즘] 1110 더하기 사이클

DongGyu Jung·2022년 1월 16일
0
post-thumbnail

게시물을 작성하면서 복습하는 문제를 선정하는 기준은<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

❗ 풀이

My Code

# Case 1

메모리 : 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)

# Case 2

메모리 : 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)

❣ 다른 풀이

새로운 코드가 있을까 검색해보았지만 대부분 유사한 풀이여서 넘어가도록 하겠습니다!


0개의 댓글