반응형
https://school.programmers.co.kr/learn/courses/30/lessons/12943
나의 코드
let index = 0
function solution(num) {
if(index == 0 && num == 1 ) return 0;
if(index == 500) return -1;
num % 2 ? num = num * 3 + 1 : num = num / 2
index++
if(num == 1) return index;
return solution(num);
}
조건 1. 주어진 수가 1인 경우에는 0을 반환
조건 2. 작업을 500번 반복할 때까지 1이 되지 않는다면 -1을 반환
조건 3. 주어진수가 500번안에 1이된다면 몇번만에 되는지 그 수를 반환하시오
조건 4. num은 1이상 8백만이하
문제 보자마자 재귀함수 생각이 났다.
첫 번째 if( num == 1) return 0 이렇게 하면 주어진 수가 1인경우에 0을 정상반환하지만 주어진수가 8번만에 1된다면 그때도 0을 반환하기에 처음 1이 주어진 것을 표시하기위해 index == 0 이라는 조건도 추가해주었다.
두 번째 if는 조건 2를 만족시키기위해 작성하였다.
세 번째 num % 2 은 짝수면 2 홀수라면 3을곱하기 1더한다
그리고 index가 1 증가하고
이때 num == 1이면 index를 반환한다
1이 아니면 500까지 무한루프이다.
다른 사람 풀이
풀이1)
function solution(num) {
var answer = 0;
while(num !=1 && answer !=500){
num%2==0 ? num = num/2 : num = num*3 +1;
answer++;
}
return num == 1 ? answer : -1;
}
while문이 더 빠르다.
풀이2)
function solution(num,count = 0) {
return num == 1 ? (count >= 500 ? -1 : count) : solution(num%2 ? num*3 + 1 :num/2 , ++count );
}
다른 사람 풀이를 더 쉽게 고치다가 에러가 떴는데 아래와 같은 개념을 또 알게 되었다.
재귀함수와 증감 연산자를 같이 사용할 때는 주의해야한다.
https://html-jc.tistory.com/375
반응형
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스-JS] level 1. 행렬의 덧셈 (0) | 2022.08.06 |
---|---|
[프로그래머스-JS] level 1. 핸드폰 번호 가리기 <*> <공사중> (0) | 2022.08.05 |
[프로그래머스-JS] level.1 제일 작은 수 제거 <**> (0) | 2022.08.04 |
[프로그래머스-JS] level.1 최대공약수와 최소공배수 <*> (0) | 2022.08.04 |
[프로그래머스-JS] level.1 정수 제곱근 판별 < (0) | 2022.08.04 |