이것저것 공부한 기록

C++) 프로그래머스 문제 풀이_콜라스 추측 본문

Study/프로그래밍 문제풀이

C++) 프로그래머스 문제 풀이_콜라스 추측

블랜디 2019. 10. 24. 17:17
1-1. 입력된 수가 짝수라면 2로 나눕니다.  
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. 
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

 

백준 문제 풀다가 프로그래머스에서도 풀어봐야 할 것 같아서 사이트 이동.

전체적으로 좀.. 백준 문제보다 더러운 문제가 많구나 생각했는데

생각해보니 프로그래머스에서도 dp를 찾아서 풀면 깔끔한 문제가 많겠군 해서 음.

 

무튼 이 문제 자체는 굉장히 간단했다.

그러나 계산과정에서 값이 어디까지 늘어나는건지 가늠을 못 해서 자료형 지정하는데 약간 애먹었음.

그리고 문제의 13번 입력값...

 

13번 입력값에 대해 약간 의문점이 있는데,

인풋값으로 1이 들어갔을 때 왜 0이 나와야 하는가?

 

1이 들어가면 1-2로 들어가서 3을 곱하고 1을 더하는 과정부터 수행해서 결국 3이 출력되어야 하는게 아닌가?

무튼 이 문제는 1이면 바로 아무 연산도 수행하지 않아도 되기 때문에 0이라고 해야 맞출 수 있는 문제였다.

해결을 위해 break문을 for문의 맨 위로 올려주었다.

원래 구현에서 그냥 500번 수행해서 1이 될 경우에도 문제가 없기 때문에. 

 

근데 음..... 내 생각일지 모르겠지만 문제에 부가설명이 좀 더 필요해보인다.

#include <string>
#include <vector>

using namespace std;

int solution(int num) {
    int answer = 0;
    __int64_t input = num ;
    
    for( int i = 0 ; i < 500 ; ++ i)
    {
        if( input == 1 )
            break ;
        
        if( input%2 == 0 )
        {
            input=input/2 ;
            answer++;
        }
        else
        {
            input=input*3+1 ;
            answer++;
        }
        
        if( input == 1 )
            break ;
    }
    
    if( input != 1 )
        answer = -1 ;
    
    return answer;
}