λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Problem Solving

[Swift Algorithm] 콜라츠 μΆ”μΈ‘ Programmers(Lv.1)

by seolhee2750 2021. 6. 14.
문제 μ„€λͺ…

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

 

λ‚΄ 문제 풀이
func solution1(_ num:Int) -> Int {
    var repeatTime = 0 // 콜라츠 μΆ”μΈ‘ 반볡 횟수 μ €μž₯ λ³€μˆ˜
    var n = num
    
    // n이 1이 아닐 λ•Œ, 짝수라면 2둜 λ‚˜λˆ„κ³  ν™€μˆ˜λΌλ©΄ 3을 κ³±ν•˜κ³  1을 λ”ν•˜λŠ” whileλ¬Έ
    while n != 1 {
        // 짝수일 λ•Œ
        if n % 2 == 0 {
            n = n / 2
            repeatTime += 1
        }
        
        // ν™€μˆ˜μΌ λ•Œ
        else {
            n = n * 3 + 1
            repeatTime += 1
        }
        
        // λˆ„μ λœ 반볡 νšŸμˆ˜κ°€ 500번이 됐을 경우, 반볡 횟수λ₯Ό -1둜 μ΄ˆκΈ°ν™” ν›„ νƒˆμΆœ
        if repeatTime == 500 {
            repeatTime = -1
            break
        }
    }
    
    // 콜라츠 μΆ”μΈ‘ 성곡 μ‹œ 반볡 횟수 좜λ ₯, 500번 이상 반볡 μ‹œ -1 리턴
    return repeatTime
}
  • μ§μˆ˜μΈμ§€ μ•„λ‹Œμ§€ νŒλ³„ ν•˜μ—¬ 콜라츠 μΆ”μΈ‘ 계산 적용, 반볡 νšŸμˆ˜κ°€ 500번 됐을 경우 while문을 νƒˆμΆœν–ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • 거의 짝 / 홀 νŒλ³„ λ¬Έμ œλ‚˜ 닀름 μ—†μ—ˆλ‹€κ³  μƒκ°ν•˜κ³ , μ‰¬μ›Œμ„œ 금방 ν’€μ—ˆλ‹€.

 


 

πŸ– [ μΆ”κ°€ ] 1주일 ν›„ λ‹€μ‹œ 풀어보기

func solution(_ num:Int) -> Int {
    var n = num
    var count = 0
    
    while n > 1 {
        n%2==0 ? (n=n/2) : (n=n*3+1)
        count += 1
        if count == 500 { count = -1; break }
    }
    
    return count
}
  • 첫 번째 풀이와 λ‘œμ§μ€ 같은데, μ‚Όν•­ μ—°μ‚°μž μ‚¬μš©ν•˜μ—¬ 훨씬 κ°„κ²°ν•΄μ‘Œλ‹€.

 


 

문제

https://programmers.co.kr/learn/courses/30/lessons/12943

λŒ“κΈ€