백준의 반복문 문제 중 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)
그럼 십의 자리 수와 일의 자리 수가 뒤바뀌어서 더해지게 되겠죠?
이를 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로도 가능한 방법이 있을것입니다!
종료.
'알고리즘 예시 > 백준' 카테고리의 다른 글
[Baekjoon] 백준 #2292번 파이썬 해답 (0) | 2023.01.13 |
---|---|
[Baekjoon] 백준 #1316번 파이썬 해답 (0) | 2023.01.11 |
[Baekjoon] 백준 #4344번 파이썬 해답 (0) | 2023.01.08 |
[Baekjoon] 백준 #10871번 파이썬 해답 (0) | 2023.01.05 |
[Baekjoon] 백준 #11022번 파이썬 해답 (0) | 2023.01.03 |