[javaScript] 콜라츠 추측 do...while과 while 문의 차이

김태훈·2022년 1월 26일
0

알고리즘

목록 보기
2/2

오늘은 프로그래머스에 있는 콜라츠 추측 문제를 풀었습니다.

제가 문제를 풀다가 막힌 부분이 있어 이번에 리뷰를 하면서 다시 공부를 해보려고 합니다.

콜라츠 추측의 문제는 다음과 같습니다.

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

저는 처음에 이 문제를 do...while로 풀고자 했습니다. 그래서 다음과 같이 코드를 적었는데요.

function solution(num) {
  let answer = 0
  do {
    num % 2 === 0 ? num /= 2 : num = num * 3 +1
    answer += 1
    if (answer >= 500) {
    return -1
  }
  } while(num !== 1)
  
  return answer
}

계속해서 테스트10 중 1개의 케이스에서 틀렸다고 나왔습니다. 그러다가 do...while의 작동 원리에 대해 고민하기 시작했고 do...while은 조건문과 상관없이 무조건 한 번은 작동한다는 것을 깨달았습니다.

위의 코드는 'num === 1'일 때에도 무조건 한 번 실행되기 때문에 결과 answer는 3이 나오게 되지만 사실은 'num === 1'일 때에는 바로 0이 retrun되게 해야한다는 점을 이해하게 되었고 결국 do...while이 아닌 while문으로 해당 문제를 풀 수 있었습니다.

해당 문제의 코드는 다음과 같이 작성했습니다.

function solution( num ) {
    var answer = 0;
    while ( num !== 1 ) {
        if (answer > 500){
            return -1
        }
        num % 2 === 0 ? num = num / 2 : num = num * 3 + 1
         answer++;
    }
    return answer;
}

문법에 대한 이해를 한층 높일 수 있었던 계기가 되었습니다....ㅎ

profile
1일 1커밋 1블로그!

0개의 댓글