본문 바로가기

알고리즘 예시/백준

[Baekjoon] 백준 #1110번 파이썬 해답 (애국자 ver)

320x100

 

백준의 반복문 문제 중 while문을 사용한 사례입니다.
단계별 → 반복문에서 마지막에 위치하고 있습니다.

 

일단 문제를 읽어보겠습니다.

 

 

보았을때 머릿속에서 바로 팍! 떠오르진 않습니다.

 

중요한점은 N의 사이클 길이를 구한다는 점입니다.

 

 

생각할 시간

 

.

.

str을 써서 두자리 수를 입력했을때,

10의 자릿수와 1의 자릿수를 분리하고 이를 따로 때네어 하는

계산방법이 있을 것이라고 생각됩니다.

 

다만 잘 되지 않았습니다.

 

.

.

 

생각할 시간 x 2

 

.

.

잠시 멈추고

 

굳이 str을 쓰지 않아도 두자리수를 떼내야 한다면

나눗셈을 사용해서 떼낼수 있지 않을까요.

 

나머지와 몫을 떼서 10을 곱하면 방법이 나오지 않을까 합니다.

 

     몫 = N // 10
     나머지 = N % 10

 

실제로 생각을 편하게 하기 위해서 한글로 변수를 넣어 봤습니다.

 

     사이클길이 = 사이클길이+1

 

사이클길이는 일단 cycle이 한번 돌때마다

1씩 추가되어야 합니다.

 

 

문제에서 제시한 용어

 

주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면
새로운 수를 만들 수 있다.

 

라는 이상한 말을 바꿔보았습니다.

 

 


주어진 수의 가장 오른쪽 자리 수



앞에서 구한 합의 가장 오른쪽 자리 수


를 이어 붙이면


새로운 수를 만들 수 있다.

 

 

좀더 봐보겠습니다.

 

     몫플러스나머지 = 몫 + 나머지

 

아까 입력할 수 N에 대해 10으로 나누었기 때문에 자동으로

일의자리수가 나머지에 남게되죠? 이를 몫과 합해줍니다.

 

문제의 조건인 처음 제시하는 숫자 N은 맨 윗줄에 들어갑니다.

 

N = int(input())​

 

그리고 N과 결과로 나올 수를 비교하기 위해서 M도 똑같이

선언해줍니다.

 

N = M = int(input())

 

제가 선언했던 몫플러스나머지를 10으로 나눈 나머지와

 

N을 10으로 나눈 나머지 곱하기 10을 더해줍니다.

 

N = int(N % 10)*10 + int(몫플러스나머지 % 10)

 

그럼 십의 자리 수와 일의 자리 수가 뒤바뀌어서 더해지게 되겠죠?

 

사이클1

 

이를 N과 비교했을 때 맞지 않는다면, 이 과정을 계속 반복해줍니다.

 

사이클2

 

사이클3

사이클4

종료

 

N의 숫자가 M의 숫자와 같아졌고, 사이클도 도출됬습니다.

 

 

파이썬에서 표현

 

while True:
     몫 = N // 10
     나머지 = N % 10
     몫플러스나머지 = 몫 + 나머지
     사이클길이 = 사이클길이+1
     N = int(N % 10)*10 + int(몫플러스나머지 % 10)
     if N == M:
        break

 

위에 주어지는 수를 넣어주면 됩니다.

그리고 break를 걸어주고, 사이클길이를 출력하면 됩니다.

 

정답

 

N = M = int(input())
사이클길이 = 0

while True:
     몫 = N // 10
     나머지 = N % 10
     몫플러스나머지 = 몫 + 나머지
     사이클길이 = 사이클길이+1
     N = int(N % 10)*10 + int(몫플러스나머지 % 10)
     if N == M:
        break
print(사이클길이)

 

while문을 사용해서 나온 결론입니다.

물론 str로도 가능한 방법이 있을것입니다!

 

종료.

728x90