문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1-1. 입력된 수가 짝수라면 2로 나눔  
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더함  
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복 

이때 주어진 수가 0이라면 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 -1 반환

 

문제 풀이법

1단계라 상당히 구현이 상당히 간단하지만 예외사항을 간과하여서 틀렸던 문제

문제에서 구현하라는 그대로 구현

 

주의해야 할 점

1. 생각 없이 하다가는 주어진 수가 1일때, 바로 while문을 타버려서 의도한 값 0이 아닌 3이 반환됨 => 주어진 수가 0일때와 1일때 return 0을 하도록 설정

2. 주어진 수가 626331일 경우 의도한 값은 -1이지만 488이 나오는 현상 발생 => 중간에 int 오버플로우가 나버리기에 int 대신 long을 사용함

 

소스 코드

 

#include <string>
#include <vector>

using namespace std;

int solution(int num) {
    int answer = 0;
    int cnt = 0;
    
    if (num == 0 || num == 1)
        return 0;
    
    long n = num;
    while (1) 
    {
        if (n % 2 == 0)
            n = n / 2;
        else
            n = n * 3 + 1;
        cnt++;
        
        if (n == 1)
            break;
        if (cnt == 500)
            return -1;
    }
    
    answer = cnt;
    return answer;
}
복사했습니다!