Algorithm/프로그래머스

[프로그래머스] Level1) 콜라츠 추측

햄습햄 2021. 10. 12. 15:54

문제 설명

 

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을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

 

 

제한 조건

 

  • 입력된 수, num은 1 이상 8000000 미만인 정수입니다.

 


풀이 과정 (자바)

 

무한 루프를 도는 while문을 만들었다.

짝수, 홀수에 맞게 작업을 처리했고, 해당 처리가 한 번 끝날 때마다 answer 값을 증가했다.

 

입력 받은 값이 1인 경우에는 원하는 결과가 나왔으므로 해당 while문을 종료했다.

작업을 진행한 결과가 1보다 작거나

(음수나 0이 나오게 되면 그 이후로는 곱하거나 나눌 경우, 0 or 음수 값이 나오게 된다.

=> 결국, 1이 나오지 않는다.)

시도한 횟수가 500번을 넘기면 answer 값을 -1로 처리하고 while문을 종료했다.

 

 

결과

 

 


다른 사람의 풀이

 

작업 횟수가 500번이 넘으면 -1을 반환하게 처리했다.

처리 과정에서 숫자가 음수나 0이 나오면 break를 통해 for문을 중지시켜 -1을 반환하게 처리했다.

짝수, 홀수 처리 과정은 삼항 연산자를 이용했다.

(입력 받은 수가 짝수라면 num/2를 실행하고, 홀수라면 num*3+1를 실행하여 처리 후, num에 값을 넣어주는 방식이다.)

 

 

기타

 

삼항 연산자를 이용해서 처리할 생각을 하지 못했었다.

확실히 좀 더 간략하게 처리되는 장점이 있다.

다른 사람의 풀이를 보니 전체적으로 깔끔하게 처리된 거 같다는 생각이 들었고, 다음에 가능하다면 이를 이용해 봐야겠다.