알고리즘🅰/프로그래머스

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

개발조각 2022. 3. 7. 23:54
728x90
반응형

 

이 문제에서 중요한 문장

  • 입력된 수가 짝수라면 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. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
  2.  단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

이 두 문장을 조건으로 넣어주면 됩니다.

 

그래서 while문에

  1. 결과로 나온 수가 1이 아니면 반복 -> 작업이 1이 될 때까지 반복이라 했으므로
  2.  작업을 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. 주어진 숫자가 입력한 수가 홀수, 짝수 일 때마다 작업을 하여 주어진 숫자를 바꾸기
  2. 작업을 할 때마다 카운터 하기

이 두 가지를 넣어 주어야 됩니다.

 

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가지 경우에 수가 남게 됩니다.

  1. num이 1이 될 경우
  2. num이 1일 안 될 경우 -> 500번 반복했는데 num이 1이 안됨

그래서

  1. num이 1이 될 경우 : 반복 횟수 반환  -> answer
  2. 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

여기까지 프로그래머스 콜라츠 추측 해결방안에 대해 설명해보았습니다.

728x90
반응형