Paradox Simulation

728x90
반응형

코딩테스트 연습 - 콜라츠 추측 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 

 

콜라츠 추측

문제 설명

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

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

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항
  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.
입출력 예
n result
6 8
16 4
626331 -1
입출력 예 설명

입출력 예 #1
문제의 설명과 같습니다.

입출력 예 #2
16 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.

입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.


※ 공지 - 2022년 6월 10일 다음과 같이 지문이 일부 수정되었습니다.

  • 주어진 수가 1인 경우에 대한 조건 추가

 

 

이번 문제는 좀 난해했다.

우선 주어진 알고리즘은 괜찮았지만, 문제가 500번 이상 반복되는 숫자가 나올 수 있다는 점인데,

이는 즉 int형을 넘어갈 수 있다는 점이다.

 

하지만 문제에서 주어진건 int형.. int 자료형의 최댓값을 넘어가게 되면 에러가 날게 뻔하므로 우선 double형으로 고쳐서 시작했다.

 

문제풀이는 다음과 같이 진행했다.

 

  1. 조건에 있는 500번이상은 -1, 주어진 수가 1일 경우 0
  2. 홀수일 때 3을 곱하고 1을 더함, 짝수일 땐 2로 나눔
  3. 몇 회 도는 게 답이기 때문에 cnt 값을 그냥 answer로 진행

 

class Solution {
    public int solution(double num) {
        int answer = 0;
        
        while (true){
            if (answer > 500){
                answer = -1;
                break;
            }
            if (num == 1)
                break;
            if(num % 2 == 0)
                num /= 2;
            else
                num = num * 3 + 1;
            answer++;
        }
        return answer;
    }
}

int num 에서 double로 받는 거로 진행했다.

answer값을 cnt처럼 사용하되 500회가 넘어가는 시점에선 -1을 반환

 

나머지는 알던 알고리즘대로 풀었다.

 

** 아마 int num 으로 그대로 진행하게 되면 테스트 케이스에 있는 3번째 문제가 488로 나오게 될 것이다.

이를 고치기 위해선 int num 이 아닌 double형으로 받게 되면 정상적으로 500회가 넘어간다. (참고 필요)

 

실행 결과
채점을 시작합니다.
정확성 테스트
테스트 1  통과 (0.04ms, 79.9MB)
테스트 2  통과 (0.03ms, 75.2MB)
테스트 3  통과 (0.03ms, 77.3MB)
테스트 4  통과 (0.02ms, 76.6MB)
테스트 5  통과 (0.07ms, 77.3MB)
테스트 6  통과 (0.02ms, 75.4MB)
테스트 7  통과 (0.06ms, 72.1MB)
테스트 8  통과 (0.02ms, 76.9MB)
테스트 9  통과 (0.03ms, 71MB)
테스트 10  통과 (0.06ms, 79.9MB)
테스트 11  통과 (0.06ms, 76.3MB)
테스트 12  통과 (0.03ms, 73.5MB)
테스트 13  통과 (0.02ms, 77.6MB)
테스트 14  통과 (0.03ms, 78.2MB)
테스트 15  통과 (0.03ms, 77.9MB)
테스트 16  통과 (0.02ms, 75MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

 

728x90
반응형
250x250
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band