[Baekjoon/Python] 백준 온라인 저지 1110번 : 더하기 사이클
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의 사이클 길이를 출력한다.
예제 입력 1 ::
26
예제 출력 1::
4
예제 입력 2 ::
55
예제 출력 2 ::
3
예제 입력 3 ::
1
예제 출력 3 ::
60
예제 입력 4 ::
0
예제 출력 4 ::
1
정답 코드 ::
#1
n = int(input())
cnt = 0
num = n
while True:
ten = num // 10
one = num % 10
total = (ten + one) % 10
num = (one * 10) + total
cnt += 1
if num == n:
break
print(cnt)
총 세 가지 방법으로 해결했다.
알고리즘은 이해를 했는데 코드 구현에서 상당히 애를 먹었다.
- while True로 무한 루프 반복 진행
- ten이라는 변수에 십의 자리. 입력 값의 몫
- one이라는 변수에 일의 자리. 입력 값의 나머지
- total이라는 변수에 십의 자리 값과 일의 자리 값을 더한 값의 10으로 나눈 나머지 저장
- 순회 할 때마다 cnt 1씩 증가
- num과 n이 같다면 while 종료
total에 십의 자리 값과 일의 자리 값을 더한 값에 10으로 나눈 나머지를 저장한다는 것이 무슨 소리인가.
ex1) 입력 값이 '26'이라고 가정하자.
2 + 6 = 8. 새로운 수 68
6 + 8 = 14. 새로운 수 84
8 + 4 = 12. 새로운 수 42
4 + 2 = 6. 새로운 수 26
정답 :: 4
ten # 2
one # 6
total # 8
total에 2+6을 해서 8이 나오는데 나머지 10을 하면 0이 된다.
ex2) 입력 값이 '55'라고 가정하자.
5 + 5 = 10. 새로운 수 50
5 + 0 = 5. 새로운 수 5
0 + 5 = 5. 새로운 수 55
정답 :: 3
ten # 5
one # 5
total # 0
total에 ten+one을 하면 10이 나오는데 여기서 10으로 나누어주면 0이 된다.
ex3) 입력 값이 '68'이라고 가정하자.
6 + 8 = 14. 새로운 수 84
8 + 4 = 12. 새로운 수 42
4 + 2 = 6. 새로운 수 26
2 + 6 = 8. 새로운 수 68
정답 :: 4
ten # 6
one # 8
total # 4
total에 ten + one을 하면 14가 나오는데 여기서 10으로 나눈 나머지를 저장하면 4가 된다.
그러면 그 다음 num = (one * 10) + total # 84가 나오는 것을 알 수 있으며, 이런 while문으로 문제가 해결됨을 알 수 있다.
#2
n = int(input())
num = n
cnt = 0
while True:
ten = num // 10
one = num % 10
total = ten + one
cnt += 1
num = int(str(num % 10) + str(total % 10))
if num == n:
break
print(cnt)
- whil True로 무한 루프 반복 진행
- ten :: 입력 받은 숫자 몫
- one :: 입력 받은 숫자 나머지
- total :: ten과 one의 합
- 순회 할 때마다 cnt + 1
- num과 n이 같다면 while 종료
이 방식은 str을 사용한 방식이다.
구글링을 하였을 때, 대부분이 이 방식을 통해 문제를 해결한 것을 알 수 있다.
위 방식과 다른 점은 total에 ten과 one의 합만을 저장한다.
이럴 경우,
ex1) 입력 값이 '26'이라고 가정하자.
2 + 6 = 8. 새로운 수 68
6 + 8 = 14. 새로운 수 84
8 + 4 = 12. 새로운 수 42
4 + 2 = 6. 새로운 수 26
정답 :: 4
ten # 2
one # 6
total # 8
이렇게 변수에 값이 저장이 되는데
num 값의 숫자를 문자열로 나누어 int(str(num%10) + str(total % 10))을 통해 새로운 num을 만들어서 해결.
#3
n = input()
num = n
cnt = 0
while True:
if len(num) == 1:
num = "0" + num
total = str(int(num[0]) + int(num[1]))
num = num[-1] + total[-1]
cnt += 1
if num == n:
break
print(cnt)
- whil True로 무한 루프 반복 진행
- 입력 조건에 따라 주어진 수가 10보다 작다면을 입력한 값의 길이가 1(한자리 수 일 경우)에 앞에 0을 붙여 두 자리 수를 만든다.
- total :: str index위치에 따른 합
- 순회 할 때마다 cnt + 1
- num과 n이 같다면 while 종료
이 코드가 다른 코드와 다른 점은 index를 사용했다는 점과
str(문자열로)로 입력한 후 list []로 저장하기 위해 입력을 int(input)이 아닌 그냥 input()으로 입력 받는 다는 점을 기억하자.
ex1) 입력 값이 '26'이라고 가정하자.
2 + 6 = 8. 새로운 수 68
6 + 8 = 14. 새로운 수 84
8 + 4 = 12. 새로운 수 42
4 + 2 = 6. 새로운 수 26
정답 :: 4
이 문제 또한 이 예시로 문제를 해결해보자.
입력을 '26'으로 받는다.
여기서 26의 경우 str의 길이(len)이 2이기 때문에 앞에 0을 붙이지 않는다.
그리고 다른 코드에서 십의 자리 수와 일의 자리 수를 더하는데 index[0]과 index[1]를 통해 합을 저장한다.
그리고 2 + 6 = 8
이 부분의 합을 또 num[-1], total[-1]로 해결해버린다.
제일 마지막 방법을 처음 생각했으나 코드 구현에 어려움이 있었다.
첫번째 두번째 방법 같은 경우는
나 또한 첫 프로그래밍을 c언어로 시작을 했었기 때문에 c언어에서 시간을 구하는 문제에서
연산자 //와 % 몫, 나머지를 사용하여 해결했기 때문에 머리 속에 남아있었다.
하지만 파이썬으로 이 문제를 해결할 때의 경우
개인적으로 세 번째 풀이가 제일 이해하기 쉽고 간편하지 않나 싶다.
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon/Python] 백준 2562 : 최댓값 (0) | 2021.03.02 |
---|---|
[Baekjoon/Python] 백준 10818 : 최소, 최대 (0) | 2021.03.02 |
[Baekjoon/Python] 백준 10951 : A+B - 4 (0) | 2021.02.28 |
[Baekjoon/Python] 백준 10952 : A+B - 5 (0) | 2021.02.28 |
[Baekjoon/Python] 백준 10871 : X보다 작은 수 (0) | 2021.02.21 |