[프로그래머스,Level 1] 콜라츠 추측(JAVA 구현)

2020. 12. 28. 14:50·CodingTest/프로그래머스(Programmers)
반응형

- 첫 풀이

  처음 풀이에 간단하다고 생각되어 바로 홀, 짝에 따른 연산처리를 작성한 뒤, 실행했을 때 예제 1,2번은 통과 처리를 했지만, 예제 3번의 경우 연산 횟수가 500번이 넘어 -1이 반환되어야 하지만 488번으로 1이 되는 것을 보고 무엇이 잘못 되었는지 고민해보았는데, 해결할 수 없어 검색을 했다.

class Solution {
    public int solution(int num) {
        int answer = 0;
        
        // 1. num이 1이 아니면 반복.
        while(num != 1){
            // 2. 연산횟수가 500이면 -1 반환.
            if(answer == 500){
                answer = -1;
                break;    
            } 
            // 3. 짝수인 경우.
            if(num % 2 == 0) {
                num/=2;
                answer++;
            }
            // 4. 홀수인 경우.
            else {
                num*=3;
                num++;
                answer++;
            }
        }
            
        return answer;
    }
}

  이 코드의 문제점

  1. while문의 종료조건인 if(answer == 500)의 경우, -1을 반환하는 것이 아니라 문제에서 알 수 있듯이 500번까지의 연산은 반환해야 한다는 점.

 

  2. 예제 3번이 488번의 연산이 나오는 이유를 찾아본 결과, num의 범위가 8,000,000이며 짝수인 경우는 / 연산을 통해 줄어들지만, 홀수의 경우는 *3 +1 연산을 수행해야 하기 때문에 int형 데이터 타입의 범위를 벗어나는 경우가 발생한다.

 

- 정답풀이

  위의 문제점과 동시에 코드를 간결하게 작성하여 아래와 같이 수정하였다.

class Solution {
    // 1. 입력 데이터 타입을 long 형으로 변경.
    public int solution(long num) {
        int answer = 0;
        
        // 2. 입력 데이터 num이 1이 아니며, 연산횟수가 500번 이하라면.
        while(num != 1 && answer <= 500){
            // 3. 삼항 연산자를 통해 num을 갱신 후, 연산횟수 증가.
            num = num % 2 == 0 ? num/=2 : (num * 3) + 1;                    
            answer++;            
        }
        
        // 4. 연산횟수가 501번인 경우는 1을 만들지 못했으므로 -1을, 나머지는 연산횟수를 반환한다.
        return answer != 501 ? answer : -1;
    }
}

  삼항 연산자를 통해 간결하게 수정할 수 있으며, 연산 횟수를 500번까지 고려해주면 된다.

저작자표시 (새창열림)
'CodingTest/프로그래머스(Programmers)' 카테고리의 다른 글
  • [프로그래머스,Level 1] 짝수와 홀수(JAVA 구현)
  • [프로그래머스,Level 1] 최대공약수와 최소공배수(JAVA 구현)
  • [프로그래머스,Level 1] 평균 구하기(JAVA 구현)
  • [프로그래머스,Level 1] 핸드폰 번호 가리기(JAVA 구현)
뜸부깅
뜸부깅
코딩에 대한 여러 개인적인 생각을 정리하고 공부를 하는 공간입니다!!
  • 뜸부깅
    코오오딩
    뜸부깅
  • 전체
    오늘
    어제
    • Note (429)
      • Skill (31)
        • Java & Spring (9)
        • Javascript & HTML & CSS (0)
        • React (0)
        • Next.js (22)
      • CodingTest (389)
        • 백준 온라인 저지(BOJ) (140)
        • 프로그래머스(Programmers) (79)
        • LeetCode (170)
      • Algorithm & Data Structure (6)
      • [Project] 포트폴리오 (3)
        • Front end (3)
        • Back end (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준1427
    백준2751
    백준
    next 14
    TypeScript
    meidum
    medium
    자바
    Java
    백준7576
    boj2108
    component-scan
    leetcode 2236
    Easy
    boj1427
    BOJ
    프로그래머스
    백준1260
    알고리즘
    백준7576자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜸부깅
[프로그래머스,Level 1] 콜라츠 추측(JAVA 구현)
상단으로

티스토리툴바