λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🧩 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/🍡 μ•Œκ³ λ¦¬μ¦˜ 풀이(Java)

콜라츠 μΆ”μΈ‘

by carrot0911 2024. 11. 9.

문제 μ„€λͺ…

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을 μ™„μ„±ν•΄ μ£Όμ„Έμš”. 단, μ£Όμ–΄μ§„ μˆ˜κ°€ 1인 κ²½μš°μ—λŠ” 0을, μž‘μ—…μ„ 500번 λ°˜λ³΅ν•  λ•ŒκΉŒμ§€ 1이 λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ –1을 λ°˜ν™˜ν•΄ μ£Όμ„Έμš”.

μ œν•œ 사항

  • μž…λ ₯된 수, num은 1이상 8,000,000 미만인 μ •μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

n result
6 8
16 4
626331 -1

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • 문제의 μ„€λͺ…κ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • 16 → 8 → 4 → 2 → 1이 λ˜μ–΄ 총 4λ²ˆλ§Œμ— 1이 λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • 626331은 500λ²ˆμ„ μ‹œλ„ν•΄λ„ 1이 λ˜μ§€ λͺ»ν•˜λ―€λ‘œ -1을 리턴해야 ν•©λ‹ˆλ‹€.

 

λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ

class Solution {
    public int solution(int num) {
        int answer = 0;

        long n = num; 
        
        while (n != 1) {
            if (answer >= 500) {
                return -1;
            }

            if (n % 2 == 0) {
                n = n / 2;
            } else {
                n = n * 3 + 1;
            }

            answer++;
        }

        return answer;
    }
}

μ½”λ“œ μ„€λͺ…

  • long n = num : overflow λ°©μ§€λ₯Ό μœ„ν•΄ long νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€.
  • while (n != 1) { } : while문을 μ‚¬μš©ν•΄μ„œ n이 1이 아닐 κ²½μš°μ— 계속 λ°˜λ³΅ν•œλ‹€.
    • if (answer >= 500) { return -1; } : answerκ°€ 500 이상인 경우 -1을 λ°˜ν™˜ν•œλ‹€.
    • if (n % 2 == 0) { n = n / 2 } : n이 짝수일 κ²½μš°μ— n을 2둜 λ‚˜λˆˆ 값을 λ‹€μ‹œ μ €μž₯ν•œλ‹€.
    • else { n = n * 3 + 1 } : n이 ν™€μˆ˜μΌ 경우 n에 3을 κ³±ν•˜κ³  1을 더해쀀닀.
    • answer++ : answer 값을 1 μ¦κ°€ν•œλ‹€.