BOJ | 1110번
Python 풀이
cnt = 0 #싸이클 횟수
old = int(input()) #기존 숫자 입력
new = old #새로운 숫자 //가장 처음에는 기존 숫자를 저장
while True:
oldFirst = new//10 #이전 숫자의 십의 자리수 저장
oldSecond = new%10 #이전 숫자의 일의 자리수 저장
oldSum = oldFirst + oldSecond #각 자리수 합
new = oldSecond*10 + oldSum%10 #다음 숫자 생성(이전 숫자의 일의 자리수와 이전 숫자 자리수의 합의 일의 자리수 결합)
cnt += 1 #싸이클 횟수 1 추가
if old == new: break #기존 숫자와 새로운 숫자가 같으면 종료
print(cnt) #싸이클 횟수 출력
cnt = 0 #싸이클 횟수
old = int(input()) #기존 숫자 입력
new = old #새로운 숫자 //가장 처음에는 기존 숫자를 저장
while True:
oldFirst = new//10 #이전 숫자의 십의 자리수 저장
oldSecond = new%10 #이전 숫자의 일의 자리수 저장
oldSum = oldFirst + oldSecond #각 자리수 합
new = oldSecond*10 + oldSum%10 #다음 숫자 생성(이전 숫자의 일의 자리수와 이전 숫자 자리수의 합의 일의 자리수 결합)
cnt += 1 #싸이클 횟수 1 추가
if old == new: break #기존 숫자와 새로운 숫자가 같으면 종료
print(cnt) #싸이클 횟수 출력
한 줄씩 풀이해 보자.
-
cnt = 0
싸이클이 몇번 돌았는지 확인하기 위한 변수이다. 아래 while문을 한번 돌 때마다 1씩 추가된다. -
old = int(input())
기존 숫자를 입력받는 변수이다. 예제에서는 26을 입력했다. -
new = old
다음 숫자를 저장하는 변수이다. 여기서new
를old
로 초기화 시켜주었는데 그 이유는 다음과 같이 설명하겠다.이전 숫자의 일의 자리수와 이전 숫자의 합의 일의 자리수를 붙여서 다음 숫자가 결정된다. 그 다음 싸이클 횟수(
cnt
)를 1 추가하고 여기서 다음 숫자가 기존 숫자(이전 숫자가 아닌 제일 처음 입력받은 숫자[예제에서는 26])와 일치하는지 확인한다. 일치하지 않는다면 다음 숫자의 십의 자리수(new//10
)와 일의 자리수(new%10
)를 이전 숫자의 십의 자리수(oldFirst
)와 일의 자리수(oldSecond
)에 각각 할당시켜준다.
즉, 새로운 수가 기존 숫자와 같지 않다면 새로운 수를 이용하여 또 다른 새로운 수를 만들어야 하기 때문에 새로운 수가 이전 숫자가 되고 또 다른 새로운 수가 다음 숫자가 되는 것이다.그러나 맨 처음에,
oldFirst
와oldSecond
에는 기존 숫자의 십의 자리수와 일의 자리수가 와야하기 때문에new
에old
를 할당시켜준다. -
while True:
반복문 안에 탈출 조건이나 실행을 종료시키는 조건이 없다면 계속 반복문을 실행한다. -
oldFirst = new//10
3번에서 설명한 대로 가장 처음에는 기존에 입력받은old
변수를new
변수에 넣어주었기 때문에oldFirst = old//10
과 같은 의미이다. 예제에서는 26//10이므로oldFirst = 2
가 된다. -
oldSecond = new%10
5번과 마찬가지로oldSecond = old%10
과 같은 의미이고 예제에서는 26%10이므로oldSecond = 6
이 된다. -
oldSum = oldFirst + oldSecond
이전 숫자의 각 자리수의 합이다. 예제에서는 8이 된다. -
new = oldSecond*10 + oldSum%10
이전 숫자를 가지고 새로운 수를 만들어야 한다.
새로운 수는 이전 숫자의 일의 자리수(oldSecond
)와 이전 숫자의 합의 일의 자리수(oldSum%10
)를 순서대로 붙여서 만든다.oldSecond
가 십의 자리수가 되므로oldSecond
에 10을 곱해준다. 예제에서new
는 68이 된다. -
cnt += 1
새로운 수가 만들어지면 싸이클을 한번 돈 것이다. -
if old == new: break
기존 숫자와 새로운 수가 같으면 while문을 빠져나간다.- 만약 같지 않다면 5번으로 돌아가서 새로 만들어진 수(68)이 이전 숫자가 되어 다시 새로운 수(84)를 만들어 낸다.
-
print(cnt)
while문을 빠져나왔다면 싸이클 회전 수를 출력하고 문제가 끝이난다.
C++ 풀이
#include <iostream>
using namespace std;
int d(int n) {
return n % 10;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
int newNum;
int cnt = 1;
cin >> N;
int tmpN = N;
while (true) {
int de = (tmpN - d(tmpN)) / 10;
newNum = d(tmpN) * 10 + d(d(tmpN) + de);
if (newNum == N) {
cout << cnt;
break;
}
else tmpN = newNum;
cnt++;
}
}
Author And Source
이 문제에 관하여(BOJ | 1110번), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@hrpp1300/BOJ-1110번
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <iostream>
using namespace std;
int d(int n) {
return n % 10;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
int newNum;
int cnt = 1;
cin >> N;
int tmpN = N;
while (true) {
int de = (tmpN - d(tmpN)) / 10;
newNum = d(tmpN) * 10 + d(d(tmpN) + de);
if (newNum == N) {
cout << cnt;
break;
}
else tmpN = newNum;
cnt++;
}
}
Author And Source
이 문제에 관하여(BOJ | 1110번), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hrpp1300/BOJ-1110번저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)