[프로그래머스] 콜라츠 추측
이 문제에서 중요한 문장
- 입력된 수가 짝수라면 2로 나눕니다.
- 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
- 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
- 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.
해결방안
function solution(num) {
//내가 푼 방식
var answer = 0;
while(num !== 1){
num%2 ? num = num*3+1 : num = num/2
answer++;
}
if(answer > 500) answer = -1;
return answer;
// 다른 사람의 풀이 보기에서 나온 방식
var answer = 0;
while(num !=1 && answer !=500){
num%2 ? num = num*3 +1 : num = num/2;
answer++;
}
return num == 1 ? answer : -1;
}
제가 푼 방식과 다른 사람의 풀이 보기에서 나온 방식이 비슷하긴 한데
다른 사람의 풀이 보기 방식이 더 좋은 코드인 것 같아서 다른 사람의 풀이 보기 방식을 설명하겠습니다.
- answer = 0 : 작업 반복 횟수 초기화
while(num !=1 && answer !=500)
이 문제는 1이 될 때까지 작업을 반복해줘야 하기 때문에 for문이 아닌 while문을 사용해주었습니다.
while문 조건에는 위에 문제 설명에서
- 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
- 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.
이 두 문장을 조건으로 넣어주면 됩니다.
그래서 while문에
- 결과로 나온 수가 1이 아니면 반복 -> 작업이 1이 될 때까지 반복이라 했으므로
- 작업을 500번 안 하면 반복 -> 작업이 500번 이상 반복해도 1이 안되면 -1을 반환하라 했으므로 (굳이 500번 이상 반복할 필요가 없음)
이러한 조건을 쓰면 되는데요.
1번을 코드로 쓰면 : num !=1
2번을 코드로 쓰면 : answer !=500
이걸 두 개의 조건에 부합해야 됨으로 and연산자를 사용하여
num !=1 && answer !=500
이렇게 써주시면 됩니다.
num%2 ? num = num*3 +1 : num = num/2;
answer++;
이제 while문 안에
- 주어진 숫자가 입력한 수가 홀수, 짝수 일 때마다 작업을 하여 주어진 숫자를 바꾸기
- 작업을 할 때마다 카운터 하기
이 두 가지를 넣어 주어야 됩니다.
1번은 삼항연산자를 써주었습니다.
삼항 연산자
구문 : 조건 ? true : false
- 조건이 true이면 true를 실행
- 조건이 false이면 false를 실행
홀수인지 짝수인지는 %2를 써주면 구할 수 있습니다.
- 홀수 % 2 = 0이 아닌 숫자
- 짝수 % 2 = 0
그래서 num%2 ? 홀수일 때 :짝수일 때 이렇게 구하시면 됩니다.
num이 그대로 가면 안됨으로, 변경된 num을 다시 num에 넣어 주었습니다.
그리고 홀수, 짝수일 때 코드를 구하면
- 입력된 수가 짝수라면 2로 나눕니다. -> num = num/2
- 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. -> num = num*3+1
num%2 ? num = num*3 +1 : num = num/2;
num이 1이 될 동안 카운트를 해야 되기 때문에
삼항연산식 아래에 answer++을 넣어주었습니다.
return num == 1 ? answer : -1;
while문을 다 반복하면 2가지 경우에 수가 남게 됩니다.
- num이 1이 될 경우
- num이 1일 안 될 경우 -> 500번 반복했는데 num이 1이 안됨
그래서
- num이 1이 될 경우 : 반복 횟수 반환 -> answer
- num이 1일 안 될 경우 : -1 반환 -> -1
을 써주어야 됩니다.
이것도 역시 삼항 연산자를 사용하여 return num == 1 ? answer : -1; 이렇게 써주었습니다.
테스트 1 (n=6)
n=6
6은 짝수 -> 6/2=3
answer = 1
n=3
3은 홀수 -> 3*3+1=10
answer = 2
n=10
10은 짝수 -> 10/2=5
answer = 3
n=5
5은 홀수 -> 5*3+1=16
answer = 4
n= 16
16은 짝수 -> 16/2=8
answer = 5
n= 8
8은 짝수 -> 8/2=4
answer = 6
n= 4
4은 짝수 -> 4/2=2
answer = 7
n= 2
2은 짝수 -> 2/2=1
answer = 8
return num == 1 ? answer : -1;에서 num==1임으로 answer반환
answer = 8
여기까지 프로그래머스 콜라츠 추측 해결방안에 대해 설명해보았습니다.