λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“– Problem Solution/Programmers

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 콜라츠 μΆ”μΈ‘ Swift

by Fomagran πŸ’» 2020. 3. 1.
728x90
λ°˜μ‘ν˜•

문제 μ„€λͺ…

 

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
16 4
626331 -1
6 8

풀이:λͺ‡ 번 λ„λŠ”μ§€ μΈ‘μ •ν•˜κΈ° μœ„ν•΄ x λ³€μˆ˜λ₯Ό λ§Œλ“€κ³  μΈμžκ°’μœΌλ‘œ μž…λ ₯될 num은 값을 λ³€κ²½λͺ»ν•˜λ―€λ‘œ numκ³Ό 같은 nλ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.

그리고 while문에 n이 1이 μ•„λ‹ˆλΌλ©΄ λ°˜λ³΅μ„ 계속 ν•˜κ²Œ ν•˜κ³ 

n이 짝수라면 n/2 ν™€μˆ˜λΌλ©΄ n*3+1을 ν•΄μ£Όκ³  xλ₯Ό 1μ”© μ¦κ°€μ‹œν‚¨λ‹€. 그리고 xκ°€ 500이 λ„˜μ–΄κ°€λ©΄ -1을 μ•„λ‹ˆλ©΄ xλ₯Ό λ°˜ν™˜ν•˜κ²Œ ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func solution(_ num:Int-> Int {
    var x = 0
    var n = num
    while n != 1 {
        if n%2 == 0 {
            n = n/2
        }else{
            n = n*3+1
 
        }
        x += 1
    }
    return x > 500 ? -1 : x
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
728x90
λ°˜μ‘ν˜•

λŒ“κΈ€