https://programmers.co.kr/learn/courses/30/lessons/12943
코딩테스트 연습 - 콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2
programmers.co.kr
문제 설명
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 미만인 정수입니다.
01. 내가 이해한 코드 - 첫 번째
public int solution(long num) {
int answer = 0;
do {
if(answer == 500) {
answer = -1;
} else {
num = num % 2 == 0? num / 2 : (num *3) + 1;
answer++;
}
} while (num != 1);
return answer;
}
- 일단 do-while 문을 사용해서 작성했는데, 일부 숫자는 적용이 되지만, 예제에서 -1을 리턴한다고 하는 626331 같은 숫자는 통과하지 못했다.
채점 결과정확성: 68.8합계: 68.8 / 100.0
do-while문은 조건식과 블럭의 순서가 반대로 되어있기 때문에,
블럭{} 안에 있는 내용이 먼저 수행되고 나서 조건식을 평가하기 때문에 그런 것 같다.
02. 그렇다면 while문으로 그냥 바꿔보자! - 두 번째
public int solution(long num) {
int answer = 0;
while(num != 1) {
if(answer == 500) {
answer = -1;
break;
} else {
num = num % 2 == 0? num / 2 : (num * 3) + 1;
answer++;
}
}
return answer;
}
- if 문 뒤에 break;를 작성하지 않으면 매개값이 626331이였을 때 -1 출력이 안된다. 꼭 작성하도록 하자.
- 또한, 매개변수를 long으로 형변환해서 바꾸지 않으면 87점대에서 멈춰서 풀리지 않는다. -> Overflow 때문임
'Study > Code Review' 카테고리의 다른 글
[프로그래머스] 문자열 다루기 (0) | 2022.02.06 |
---|---|
[프로그래머스] 자리수 더하기 (0) | 2022.01.27 |
DAY 92. JavaScript 배열 연습 문제 - 배열에 추가, 삭제 (0) | 2021.11.18 |
DAY 91. JavaScript 배열 연습 문제 - 입력 받은 문자열로 배열 만들기 (0) | 2021.11.17 |
DAY 90. JavaScript 배열 연습 문제 - reverse(), concat() 활용 (0) | 2021.11.16 |