문제설명
1937년 Collatz란 사람에 의해 제기된 이 추측은 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다.
작업은 다음과 같습니다.
예를 들어 입력한 수가 6이라면 6->3->10->5->16->8->4->2->1이 되어 총 8번만에 1이 됩니다.
위 작업을 몇번이나 반복 해야 하는 지 반환하는 함수
단, 작업을 500번 반복해도 1이 되지 않는다면 -1을 반환 해주세요.
제한사항
- 입력한 수, num은 1 이상 8000000 미만인 정수입니다.
내가 푼 문제 풀이
function solution(num) {
let answer = 0; // 몇번 반복 했는 지 담는 변수
while(num!=1){
if(answer == 500){
return -1
}else{
(num%2==0)?num=num/2 : num=num*3+1
answer++
}
}
return answer;
}
1) answer 변수에는 몇번 반복 했는 지 횟수를 담는다.
2) num이 1이 될 때까지 반복문을 돌린다.(whilte(num!=1)
3) while문 안에 if문을 넣어서 answer가 500번이 되면 -1을 return 해서 함수를 끝낸다.
else인 경우 삼항연산자를 사용해서 콜라프의 추측 작업을 실행하고 횟수를 ++(1씩 늘린다.)
(for문을 사용하지 않은 이유는 조건 범위가 없기 때문이다.)
(잘못 생각한 점) 처음에 시도 할 때 if문을 while문 밖에 썼더니 안됐는데 if문을 밖에 썼을 때 500이 아닌 경우에는 조건에 맞을 때까지 while문이 반복하기 때문에 안되는 것이 맞았다. 다음번 부터는 주의!!
다른 사람이 푼 문제 풀이
function solution(num) {
let answer = 0; // 몇번 반복 했는 지 담는 변수
while(num!=1 && answer != 500){
(num%2==0)?num=num/2 : num=num*3+1
answer++
}
return num == 1? answer : -1;
}
https://programmers.co.kr/learn/courses/30/lessons/12943
'항해 중 > 2주차 알고리즘(프로그래머스)' 카테고리의 다른 글
4일차 → 같은 숫자는 싫어(filter()) (0) | 2021.11.11 |
---|---|
4일차 → 3진법 뒤집기(toString(), split(), reverse(), join(), parseInt()) (0) | 2021.11.11 |
4일차 → 하샤드 수(forEach(), reduce()) (0) | 2021.11.11 |
3일차 → 제일 작은 수 제거하기(indexOf(), splice(), filter()) (0) | 2021.11.10 |
3일차 -> 정수 제곱근 판별(Math.sqrt(), Math.pow(), Number.isInteger()) (0) | 2021.11.10 |
댓글