프로그래머스 1단계 Java 콜라츠 추측 문제입니다.
문제 설명
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 |
입출력 예 설명
입출력 예 #1
문제의 설명과 같습니다.
입출력 예 #2
16 -> 8 -> 4 -> 2 -> 1 이되어 총 4번만에 1이 됩니다.
입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야합니다.
문제 해결 방법
① 곱셈의 결과값을 충분히 담아낼 수 있는 자료형으로 선언 및 입력된 수로 초기화
② 2로 나누었을 때 나머지가 0이면 짝수이므로 삼항연산자로 계산
⑴ 짝수일 경우 ▶ 현재 값을 2로 나눈 몫 대입
⑵ 홀수일 경우 ▶ 현재 값에 3을 곱하고 1을 더한 값 대입
③ 현재 시도 횟수가 500회 미만인지 판단
⑴ 미만일 경우 ▶ 현재 시도 횟수 + 1
⑵ 도달한 경우 ▶ 현재 시도 횟수에 -1 대입
④ 현재 시도 횟수가 -1 인지 판단
⑴ -1 일 경우 ▶ 작업을 중단하고 -1 값 반환
⑵ 현재 값이 1이 될 때 까지 ②③을 반복
⑤ 현재 값이 1일 경우 반복한 시도 횟수를 반환
class Solution {
public int solution(int num) {
// ① 곱셈의 결과값을 충분히 담아낼 수 있는 자료형으로 선언 및 입력된 수로 초기화
int answer = 0;
double temp = num;
while(temp != 1) {
/*
② 2로 나누었을 때 나머지가 0이면 짝수이므로 삼항연산자로 계산
⑴ 짝수일 경우 ▶ 현재 값을 2로 나눈 몫 대입
⑵ 홀수일 경우 ▶ 현재 값에 3을 곱하고 1을 더한 값 대입
*/
temp = temp % 2 == 0 ? temp / 2 : temp * 3 + 1;
/*
③ 현재 시도 횟수가 500회 미만인지 판단
⑴ 미만일 경우 ▶ 현재 시도 횟수 + 1
⑵ 도달한 경우 ▶ 현재 시도 횟수에 -1 대입
*/
answer = answer < 500 ? answer + 1 : -1;
/*
④ 현재 시도 횟수가 -1 인지 판단
⑴ -1 일 경우 ▶ 작업을 중단하고 -1 값 반환
⑵ 현재 값이 1이 될 때 까지 ②③을 반복
*/
if(answer == -1)
return answer;
}
// ⑤ 현재 값이 1일 경우 반복한 시도 횟수를 반환
return answer;
}
}
※ 삼항연산자
②③ 의 반환값은 삼항연산자로 값을 정하게 되는데, if/else 문과 매우 흡사하여 코드가 간결해지는데에 도움이 됩니다.
삼항연산자 사용법은 다음과 같으며, 참 또는 거짓의 값을 반드시 반환하는 것이 if/else 문과의 차이점입니다.
Condition ? TRUE : FALSE
if/else 문에 비해 구문이 간단하다해서 속도가 빠른 것은 아닙니다.
※ 위 코드는 해결 방법 중 한가지이며 더 효율적인 코드가 있을 수 있습니다.
문제 풀어보기 ▶ https://programmers.co.kr/learn/courses/30/lessons/12943
코딩테스트 연습 - 콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2
programmers.co.kr
'programmers code review > _step1' 카테고리의 다른 글
짝수와 홀수 (0) | 2021.08.13 |
---|---|
최대공약수와 최소공배수 (0) | 2021.08.11 |
평균 구하기 (0) | 2021.08.10 |
하샤드 수 (0) | 2021.08.09 |
핸드폰 번호 가리기 (0) | 2021.08.09 |
댓글