programmers.co.kr/learn/courses/30/lessons/12943
문제
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 미만인 정수입니다.
결괏값 예시
n | result |
6 | 8 |
16 | 4 |
626331 | -1 |
기본 제공 틀
function solution(num) {
var answer = 0;
return answer;
}
풀이 [JavaScript]
안녕하세요, 오늘은 콜라츠 추측문제를 풀이해보도록 하겠습니다.
이번 문제에서는 4가지 포인트를 명심해야하는데요.
문제설명에서 주어진 1-1, 1-2, 2 그리고 작업이 500번을 반복해도 1이 되지 않는다면 -1을 반환해달라는 부분입니다.
우선 1-1과 1-2에 주어진 조건을 만족하기 위해 들어오는 값인 num 이 홀수인지 짝수인지 구분을 해주어야합니다.
그러기위해서 num 값을 2로 나누었을 때 나머지가 0인지 아닌지를 확인하기 위해 if - else문을 사용해주었습니다.
[num이 홀수인 경우]
num = num * 3 + 1;
[num이 짝수인 경우]
num = num / 2;
이렇게 num이 홀수인 경우와 짝수인 경우를 판별하는 if - else문을 완성했습니다.
다음으로 2번 구문을 보면 이 num값이 1이 될때까지 작업을 반복하라고 명시해두었습니다.
이 구문에서 중요한 힌트를 얻을 수 있었습니다.
어떤 값이 될때까지 반복하는 구문인 while문을 사용하면 되겠다는 생각을 할 수 있습니다.
그래서 while문으로 num 값이 1이 아닐때까지 작업을 반복할 수 있게 구문을 감싸주었습니다.
그리고 가장 중요한 포인트인 작업이 500번을 반복해도 1이 되지 않는다면 -1을 반환할 수 있도록 코드를 설계해보겠습니다.
결국 우리가 찾고자 하는 값을 과연 이 작업을 몇번 반복해야 1이라는 값이 반환되느냐 이기 때문에 1-1, 1-2 조건을 만족하는 if - else구문에서 코드가 한번 돌때마다 answer값을 1씩 더해주기 위해 answer++이라는 코드를 넣어주었습니다.
이 answer값이 500번을 넘는다면 -1을 반환할 수 있게 해주기위해 1-1, 1-2 구문이 실행되기 전에 answer값이 500이 넘는지 체크해주는 if- else 구문을 한 번 더 사용해주었습니다.그래서 결국 answer값이 500번이 넘는다면 -1을 리턴해주고 500번이 넘지 않는다면 1-1, 1-2 구문에 맞게 코드를 돌도록 설계를 했습니다.
function solution(num) {
var answer = 0;
while (num !== 1) {
if (answer > 500) {
return -1;
} else {
if (num % 2 == 0) {
num = num / 2;
answer++;
} else {
num = num * 3 + 1;
answer++;
}
}
}
return answer;
}
채점 결과 [JavaScript]
'알고리즘 스터디 > 프로그래머스 스킬체크 레벨 1(끝)' 카테고리의 다른 글
[프로그래머스 스킬체크 레벨 1] 약수의 합 문제 풀이 및 설명 - 자바스크립트[JAVASCRIPT] (0) | 2021.04.27 |
---|---|
[프로그래머스 스킬체크 레벨 1] 정수 제곱근 판별 문제 풀이 및 설명 - 자바스크립트[JAVASCRIPT] (0) | 2021.04.17 |
[프로그래머스 스킬체크 레벨 1] 가운데 글자 가져오기 문제 풀이 및 설명 - 자바[Java] (0) | 2020.05.21 |
[프로그래머스 스킬체크 레벨 1] 행렬의 덧셈 문제 풀이 및 설명 - 자바[Java] (0) | 2020.05.20 |
[프로그래머스 스킬체크 레벨 1] 시저 암호 문제 풀이 및 설명 - 자바[Java] (0) | 2020.05.19 |
댓글