본문 바로가기
코딩테스트 | 백준

[ 백준 1110 | C++] 더하기 사이클 : do-while문

by 솨앙 2024. 10. 4.
반응형

https://www.acmicpc.net/problem/1110

문제

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이주어진다(1자리~2자리)

- 첫번째 : 주어진 숫자의 1의자리와 10의 자리를 더해준다.

- 그 다음부터 : 맨 오른쪽 항의 1의 자리 + 결과 값의 1의자리

- 다시 처음의 숫자가 나올 때 까지 사이클의 길이를 구한다.

 

이런식으로 하면 되겠지..?

슈도 코드

1. n을 선언 : 주어진 값을 입력받을 변수 n을 선언
2. result 선언 : 각 사이클의 결과를 저장할 변수 선언
3. while(result와 n이 같지 않을 동안){
1번째 : n을 10으로 나눈 몫과 나머지를 더해준다. ->cnt : +1, result : 앞에 나머지*10 + 둘이 더한 값을 10으로 나눈 값의 나머지
2번째 ~ : result를 10으로 나눈 몫+나머지 -> cnt :+1,result : 앞에 나머지*10 + 둘이 더한 값을 10으로 나눈 값의 나머지
4. if(result ==n) -> cnt 출력

 

정답 코드

#include <iostream>

using namespace std;

int main(){
    int n;
    cin>>n;
    int result = n;
    int cnt = 0;
    
    do{
            int i = result/10 + result %10;
            result = (result%10)*10 + i%10;
            cnt++;
        
    }while(result !=n);
    cout <<cnt;
return 0;
}

 

틀린 코드

#include <iostream>

using namespace std;

int main(){
    int n;
    cin>>n;
    int result = n;
    int cnt = 0;
    
    while(result != n){
            int i = result/10 + result %10;
            cnt ++;
            result = (result%10)*10 + i%10;
        
    }
    cout <<cnt;
return 0;
}
  • 엥 while문 안에 조건문을 넣지 않으려고 초기 result 를 n으로 선언했는데, while 문이 돌아가는 조건이 result!=n이란다.
  • 모든 입력에 대해 0으로 나옴..
  • 0을 입력 받아도 한번은 루프를 돌아서 1을 출력해내야한다.
  • 수정할 방법을 알아보던 중 do-while문을 배웠다.

새로 알게 된 점

do-while 문 (참고 : https://boycoding.tistory.com/189)
- 루프 조건이 초기에 거짓인 경우에도 루프를 적어도 한번 돌아야하는 경우 사용
: 0을 입력받아도 루프를 1번은 돌아야하는 이번 문제에 아주 적합하다.
- statement에 루프 문을 작성하고, 문이 실행되면 condition을 검사한다 -> true이면 다시 반복 실행
반응형