본문 바로가기

콜라츠 추측

programmers code review/_step1 2021. 8. 10.
728x90

프로그래머스 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

댓글