BOJ | 1110번

송치헌·2021년 6월 14일
0
post-thumbnail

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) #싸이클 횟수 출력

한 줄씩 풀이해 보자.

  1. cnt = 0 싸이클이 몇번 돌았는지 확인하기 위한 변수이다. 아래 while문을 한번 돌 때마다 1씩 추가된다.

  2. old = int(input()) 기존 숫자를 입력받는 변수이다. 예제에서는 26을 입력했다.

  3. new = old 다음 숫자를 저장하는 변수이다. 여기서 newold로 초기화 시켜주었는데 그 이유는 다음과 같이 설명하겠다.

    이전 숫자의 일의 자리수와 이전 숫자의 합의 일의 자리수를 붙여서 다음 숫자가 결정된다. 그 다음 싸이클 횟수(cnt)를 1 추가하고 여기서 다음 숫자가 기존 숫자(이전 숫자가 아닌 제일 처음 입력받은 숫자[예제에서는 26])와 일치하는지 확인한다. 일치하지 않는다면 다음 숫자의 십의 자리수(new//10)와 일의 자리수(new%10)를 이전 숫자의 십의 자리수(oldFirst)와 일의 자리수(oldSecond)에 각각 할당시켜준다.
    즉, 새로운 수가 기존 숫자와 같지 않다면 새로운 수를 이용하여 또 다른 새로운 수를 만들어야 하기 때문에 새로운 수가 이전 숫자가 되고 또 다른 새로운 수가 다음 숫자가 되는 것이다.

    그러나 맨 처음에, oldFirstoldSecond에는 기존 숫자의 십의 자리수와 일의 자리수가 와야하기 때문에 newold를 할당시켜준다.

  4. while True: 반복문 안에 탈출 조건이나 실행을 종료시키는 조건이 없다면 계속 반복문을 실행한다.

  5. oldFirst = new//10 3번에서 설명한 대로 가장 처음에는 기존에 입력받은 old변수를 new변수에 넣어주었기 때문에 oldFirst = old//10과 같은 의미이다. 예제에서는 26//10이므로 oldFirst = 2가 된다.

  6. oldSecond = new%10 5번과 마찬가지로 oldSecond = old%10과 같은 의미이고 예제에서는 26%10이므로 oldSecond = 6이 된다.

  7. oldSum = oldFirst + oldSecond 이전 숫자의 각 자리수의 합이다. 예제에서는 8이 된다.

  8. new = oldSecond*10 + oldSum%10 이전 숫자를 가지고 새로운 수를 만들어야 한다.
    새로운 수는 이전 숫자의 일의 자리수(oldSecond)와 이전 숫자의 합의 일의 자리수(oldSum%10)를 순서대로 붙여서 만든다. oldSecond가 십의 자리수가 되므로 oldSecond에 10을 곱해준다. 예제에서 new는 68이 된다.

  9. cnt += 1 새로운 수가 만들어지면 싸이클을 한번 돈 것이다.

    • if old == new: break 기존 숫자와 새로운 수가 같으면 while문을 빠져나간다.
    • 만약 같지 않다면 5번으로 돌아가서 새로 만들어진 수(68)이 이전 숫자가 되어 다시 새로운 수(84)를 만들어 낸다.
  10. 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++;
    }
}
profile
https://oraange.tistory.com/ 여기에도 많이 놀러와 주세요

0개의 댓글