221215 프로그래머스 콜라츠 추측(자바, 자바스크립트)

샨티(shanti)·2022년 12월 15일
0

코딩테스트

목록 보기
2/35
post-custom-banner

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅


문제.


자바(Java) 및 자바스크립트(Javascript) 풀이 방법 및 코드

  • 짝수일 경우 2로 나누는 것은 int의 표현범위에 문제가 되지 않을 것으로 생각했음
  • 다만 입력된 수가 홀수일 경우 3을 연속적으로 곱하는 상황이 생길 수 있고, int의 표현범위를 벗어나는지 확인할 필요가 있었음
  • 실제 테스트 코드 작성 후 결과값을 확인했을 때 범위를 벗어나는 경우가 있었으므로 long 병행하여 활용해야 함
  • 참고. int의 표현범위: -2,147,483,648 ~ 2,147,483,647

JAVA Solution 1

// 처음에 풀었던 방식. 중복이 발생하였음

class Solution {
	public int solution(int num) {
    	if (num == 1) {
        	return 0;
    	}
    
    long convertedNumber = (long) num;
    
    int result = process(convertedNumber);
    
    return result;
  }
    
    public int process(long number) {
    int count = 0;

        while(number > 1) {
            if (number % 2 == 0) {
                number /= 2;
                count += 1;

                if (count == 500) {
                    return -1;
                }

                if (number == 1) {
                    return count;
                }
                continue;
            }

            number = number * 3 + 1;
            count += 1;
            if (count == 500) {
                return -1;
            }

            if (number == 1) {
                return count;
            }
        }

        return count;
    }
}

JAVA Solution 2

// 두 번째 방식. 풀이를 참조했는데 훨씬 깔끔함. 삼항연산자 역시 활용
class Solution {
    public int solution(int num) {

        long convertedNumber = (long) num;

        int result = process(convertedNumber);

        return result;
    }

    public int process(long number) {
        for (int i = 0; i < 500; i += 1) {
            if (number == 1) {
                return i;
            }
            number = (number % 2 == 0) ? number / 2 : number * 3 + 1;
        }
        return -1;
    }
}

Javascript Solution

function solution(num) {
  let number = num;

  for (let i = 0; i < 500; i += 1) {
    if (number === 1) {
      return i;
    }

    number = (number % 2 === 0) ? number / 2 : number * 3 + 1;
  }

  return -1;
}

오늘 풀면서 가장 아쉬웠던 점은 자바스크립트에서 let, for문을 사용한 것.
분명히 재귀 방법으로 풀 수 있는 방법이 있을텐데 찾아내질 못했다... 다음에 같은 문제를 다시 풀게 되는 차수에는 자바스크립트쪽을 깊게 파서 재귀로 해결해보고 싶다.

profile
가벼운 사진, 그렇지 못한 글
post-custom-banner

0개의 댓글