※ 7월 20일 수정 내역
테스트 케이스 13번에 주어지는 파라미터는 '1' 입니다.
13번 테스트 케이스만 실패가 나오시는 분들은 지문을 잘 읽고 다시 천천히 풀어주세요잉
문제 설명
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 |
입출력 예 #1
문제의 설명과 같습니다.
입출력 예 #2
16 -> 8 -> 4 -> 2 -> 1 이되어 총 4번만에 1이 됩니다.
입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야합니다.
요즘 너무 감사하게도 방문자수가 많아져서ㅠㅠ 야근을 끝내고 힘든 몸을 이끌고 문제를 풀기 위해 자리에 앉았다.
(누구신지는 모르겠지만 너무너무 감사합니둥둥둥)
문제를 읽다보면 뭐지 너무 간단한데? 라는 생각이 들 수도 있고 막막할 수도 있다.
나도 정말 심플하다고 생각했는데 한 3~40분은 고민한 거 같다 ㅠㅠㅋ
1. 입력 받은 수가 짝수면 그 수를 2로 나눠준다.
2. 짝수가 아니고 홀수라면 그 수에 3을 곱하고 1을 더해준다.
3. 입력받은 수를 위와 같은 과정들을 거치게 하여 1이 나올 때까지 반복하면 된다.
문제를 읽어가며 천천히 풀었는데 대입 연산자를.. 까먹어서 한참 고민하고 고민 했다.
package list;
public class Programmers_Collatz {
public static int solution(int num) {
/*
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을 반환해 주세요.
*/
// 몇 번이나 반복되는지 저장할 변수 answer
int answer = 0;
long number = num;
// 실행문
do {
// 반복문이 실행되면 동시에 answer++
answer++;
// 조건문
if (number % 2 == 0) {
// 파라미터로 받은 num이 짝수라면 num을 2로 나눈다
// /= 은 대입연산자 (변수 num을 2로 나눈 후 다시 변수 num에 대입)
number /= 2;
} else {
// 홀수라면 num에 3을 곱해주고 1을 더해준다
number = number * 3 + 1;
}
// 위의 작업을 반복하되, 아래와 같이 answer이 500회 이상 반복 된다면
// -1을 리턴해준다.
if (answer == 500) {
return -1;
}
// answer이 500을 넘지 않아 자연스럽게 루프문에서 빠지게 된다면 결과를 출력해준다.
if (num == 1) {
return 0;
}
// 13번 테스트 케이스는 주어지는 값이 '1'이기 때문에 0을 바로 리턴해준다.
// 7.20 추가
} while (number != 1);
// 결과 출력
return answer;
}
public static void main(String[] args) {
// 파라미터
int result = solution(626331);
// 솔루션 값 출력
System.out.print(result);
}
}
중간에 보면 number /= 2; 가 있는데, 이게 자바에서 쓰이는 대입연산자이다.
설명은 주석으로 자세히 적어놓았으니 참고하면 된다!
(댓글 남겨주시면 친절하게 답변 해드리겠습니둥둥둥)
아 ! 그리고 참고해야하는게 있는데
잘 보면 테스트 케이스3번(626331)의 결과값이 488로 나오는데, 해결 방법으로는 소스의 시작점을 보자.
// 몇 번이나 반복되는지 저장할 변수 answer
int answer = 0;
long number = num;
여기 잘 보면 num 파라미터를 long 형 변수(number)에 대입해놨는데, long형 변수가 아닌 int형 변수로 그대로 사용하게 되면 오버플로우가 발생하여 원하는 결과값이 안 나올수도 있다. 나도 이거는 한참 찾았다 ㅠ.ㅠ
어쨌든 오늘도 알찬 하루를 보내고 문제도.. 풀었다 크헝헝 퇴사 시켜줘!
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/015.gif)