[231116] Leve.1 콜라츠 추측

Bora.K | 권보라·2023년 11월 17일
0

알고리즘

목록 보기
7/11
post-thumbnail

알고리즘 문제풀이 Levle.1

[#11] 콜라츠 추측

🔓내 코드 리뷰

오류가 계속 나서 알고리즘 스터디들 하는 30분 동안 해결책을 찾았다. 이번 문제는 조건이 많이 제시되어 있어서 이것을 어떻게 효율적으로 풀 수 있을지에 대해 고민했던 것 같다.

1. 문제분석

  • 주어진 수가 1이면 0을 반환한다.

  • 주어진 수가 0이 아닐 시

    • 입력된 수가 짝수면 2로 나눈다
    • 입력된 수가 홀수라면 3을 곱하고 1을 더한다.
      -> 결과값이 1이 될 때까지 돌린다.
  • 500번을 반복할 때까지 1이 되지 않으면 -1을 반환한다.


2. 코딩화

먼저 주어진 수가 1이었을 때 0을 반환하는 함수를 먼저 실행해주고, 1이 아니었을 때에만 for문을 돌린다. for문에서 돌리는 횟수를 1부터 500 이하로 설정하고, 삼항연산자를 통해 짝수일 때와 홀수일 때의 식을 세우고, num가 1이 되면 i(돌린 횟수)를 리턴하고, 그렇지 않으면 -1을 리턴하도록 코드를 짰다.

  • 초기 코드
function solution(num) {
  if (num === 1) {
    return 0;
  }

  for (i = 1; i <= 500; i++) {
    num % 2 === 0 ? num / 2 : num * 3 + 1;
    if (num === 1) {
      return i;
    } else {
      return -1;
    }
  }
}

💡내가 한 실수 첫 번째
1. for문 안에서 삼항연산자를 사용할 때 해당 식을 num 값에 할당을 해주지 않았다.
너무 기초적인 실수라 오류를 찾고 나서 살짝 허무한 느낌이...

num % 2 === 0 ? num / 2 : num * 3 + 1;
-> num % 2 === 0 ? num = num / 2 : num = num * 3 + 1;

  • 제일 앞에 num를 한 번만 할당해도 된다.
    -> num = num % 2 === 0 ? num / 2 : num * 3 + 1;

💡내가 한 실수 두 번째
num가 1이 되면 i를 리턴하고, 아니면 -1을 리턴하는 부분에서 for문이 한 번만 돌아도 num가 1이 되지 않으면 -1을 리턴하기 때문에, 처음에 모든 수를 console.log로 찍어봐도 -1만 리턴이 되었다. 그래서 리턴문을 for문 밖으로 빼주었더니 정상적으로 실행되었다. for문을 돌릴 때에는 return이 언제 실행되는지 고민하며 풀어야겠다.

  • 수정 코드
  for (i = 1; i <= 500; i++) {
    num = num % 2 === 0 ? num / 2 : num * 3 + 1;
    if (num === 1) {
      return i;
    }
  }
  return -1;
}
profile
Frontend Engineers

0개의 댓글