Dev_from the Bottom

#22. Algorithm17_python) 더하기 사이클_백준 1110 본문

Algorithm_study

#22. Algorithm17_python) 더하기 사이클_백준 1110

고무라면 2022. 5. 28. 05:09

문제) 더하기 사이클

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


step1) 테스트

n = 26                  # n = 26이라 가정

a = n % 10
b = (n - a)//10
print(b, a)             # 십 자리 수, 일 자리 수 출력

n_temp = a + b          # 두 수의 합 : 여기서는 한 자리 수
n_temp = n_temp % 10    # 두 수의 합이 두 자리 수 일때, 오른쪽 자리 수 표현
print(n_temp)           # 한 자리 수

n1 = a * 10 + n_temp    # 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이기
print('싸이클1 :', n1)  # 싸이클 1 : 68

a = n1 % 10
b = (n1 - a) // 10
print()

print(b, a)
n_temp = a + b         # 두 수의 합 : 여기서는 두 자리수
n_temp = n_temp % 10
print(n_temp)
n2 = a * 10 + n_temp
print('싸이클2 :', n2)

>>>

2 6
8
싸이클1 : 68

6 8
4
싸이클2 : 84

 

 

step2) 시도1 : 실패

n = 26
i = 0
tag = True

while tag :
    a = n % 10
    b = (n - a)//10

    n_temp = a + b
    n_temp = n_temp % 10

    i += 1
    n1 = a * 10 + n_temp

    if n == n1:
        tag = False
    else :
        n = n1

print(i)

- 결과가 출력되지 않고, 계속 돌아감 : 무한 루프

 

 

step3) 시도2 : 실패

n = 26
i = 0
tag = True

while tag :
    a = n % 10              # 6
    b = (n - a)//10         # 2

    n_temp = a + b          # 8
    n_temp = n_temp % 10    # 8

    i += 1                  # i = 1
    n1 = a * 10 + n_temp    # n1 = 68

    if n == n1:
        tag = False
        break
    else :
        n = n1

print(i)

- break 사용했음에도, 멈추지 않고 계속 돌아감

 

step4) 시도3 : n = 26일때, 성공

n = 26
n_ab = 26                  # 기준값 : n의 absolute
i = 0
tag = True

while tag :
    a = n % 10              # 6
    b = (n - a)//10         # 2

    n_temp = a + b          # 8
    n_temp = n_temp % 10    # 8

    i += 1                  # i = 1
    print(i)
    n1 = a * 10 + n_temp    # n1 = 68
    print(n1)

    if n_ab == n1:
        # tag = False
        break
    else :
        n = n1

print()
print(f'정답 : {i}번')

>>>

1
68
2
84
3
42
4
26

정답 : 4번

 

step5) 최종 : 입력문 활용

n = int(input())
n_standard = n
i = 0

while True :
    a = n % 10    
    b = (n - a)//10

    n_temp = a + b
    n_temp = n_temp % 10

    i += 1
    n1 = a * 10 + n_temp

    if n_standard == n1:
        break
    else :
        n = n1

print(i)

>>>

26
4

 


# 배운 점

  • 무한 루프 사용
  • while문 안의 if문을 사용해서 break : break는 if문에 속해있지만, 결국 while 루프 안에 존재한다!
  • 자릿수 뽑아내는 법 : % 활용

 

# 소회

  • 오늘은 꽤 난이도 있는 문제를 깔끔하게 풀어낸 듯!
  • 구글 찾아보니, 더 간결하게 표현한 코드가 있으나 기본적인 로직은 내 코드와 같음

 

Comments