백준 알고리즘/python_

[백준 알고리즘][python] 1110번. 더하기 싸이클

nanee_ 2021. 8. 17. 15:40
728x90
반응형
SMALL
 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

 

 

# 문제

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의 사이클 길이를 출력한다.

 


# 정답입니다!

 

n = int(input())
new = n	# n으로 돌아올 때 비교를 위해 새로 n을 담은 변수
t = 0   # 사이클의 횟수 count를 위한 변수

# 문자열로 바꾸기
if new < 10 :
	new = f'0{n}'
else :
	new = f'{n}'
    
while True :
	# 각 자릿수 더하기
    m = f'{int(new[0]) + int(new[1])}'
    
    # 한 자리 숫자 -> 앞에 0 붙여주기
    if len(m) == 1 :
    	m = f'0{m}'
        
    new = f'{new[1]}{m[1]}'
    
    # 횟수 증가
    t += 1
    
    # 비교
    if int(n) == int(new) :
    	break
        
print(t)

26

4

 

이 방법은 n을 문자열로 형변환을 시킨 뒤에 문자열 인덱스를 활용한 코드이다.

 

먼저 n을 입력받고, 비교를 위해 new라는 변수에 n을 다시 담아준다.

싸이클의 횟수를 계산하기 위해 t 라는 변수를 생성해준다. (count를 위한 것이므로 초기값은 0)

 

문자열로 바꿔준 뒤, while문으로 true일 경우 반복하게 해준다.

0, 1번 째 문자를 int형으로 다시 바꿔 더해준 뒤, 또 문자형으로 바꿔주고 m 이라는 변수에 담아준다.

 

만약 또 한자리 숫자가 나올 경우를 대비해 m의 문자 길이가 1 인 경우에 앞에 0을 붙여주도록 했다.

 

주어진 수(new)의 가장 오른쪽 자리 수[1]와 앞에서 구한 합(m)의 가장 오른쪽 자리 수[1]를 이어 붙여 new에 다시 저장해준다.

 

위의 과정을 거쳤으니 t에 +1을 해 횟수를 늘려준다.

 

이 new의 값이 맨 처음 값(n)과 같은지 int형으로 바꾼 뒤,

If문으로 비교를 해서 같다면 break를 해서 while문을 빠져나오도록 한다.

 

while문을 빠져나온 뒤에는 이 과정을 몇번을 반복했는지 t 값을 출력한다.

 


# ver02 - 형변환 없이 int형 그대로 계산
n = int(input())
new = n
t = 0

while True :
    a = new // 10  # 10으로 나눈 몫
    b = new % 10   # 10으로 나눈 나머지

    # a+b의 나머지(가장 오른쪽 수)
    c = (a+b) % 10
    
    new = 10*b + c
    
    t += 1
    
    if n == new :
    	break
        
 print(t)

26

4

 

위의 방법은 형변환으로 인해 번거로운 코드였다면,

이 코드는 수학적으로 접근해 비교적 간단한 코드이다.

 

while문 전까지는 위와 동일하고, 

while문 안에서 변수 a10으로 new를 나누었을 때 몫 값(//)을 저장해준다. 이는 new의 가장 왼쪽 수가 된다.

변수 b에는 나머지값(%)을 저장해주고, 이는 new의 가장 오른쪽 수가 된다.

 

변수 cnew의 왼쪽 수와 오른쪽 수를 더해준 값(a+b)에서 10으로 나누었을 때의 나머지값(%)을 저장해 줌으로써,

a+b의 가장 오른쪽 수이다.

 

이제 new의 가장 오른쪽 수와 c의 가장 오른쪽 수를 합쳐주어야 한다.

new의 가장 오른쪽 수인 b에 10을 곱해주어서 두자리 수로 만들어 준 뒤, c를 더해준다.

이를 new에 새로 담아준다.

 

이러한 과정을 거쳤으니 t에 +=1 을 해주고,

if문으로 처음 입력 받은 수(n)와 새로운 수(new)가 같은지 비교한 뒤,

같다면 break를 통해 while문을 빠져나가도록 한다.

 

while문을 빠져나온 뒤에는 이 과정을 몇번을 반복했는지 t 값을 출력한다.

 

이 코드에서는 입력받은 값(n)이 한자리 숫자인지, 두자리 숫자인지 중요하지 않다.

왜냐하면, 10으로 한자리 숫자를 10으로 나누었을 경우 0이기 때문이다.

 

 

 

 

 

728x90
반응형
LIST