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

[Swift Algorithm] μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜ Programmers(Lv.1)

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

두 수λ₯Ό μž…λ ₯λ°›μ•„ 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, solution을 μ™„μ„±ν•΄ λ³΄μ„Έμš”. λ°°μ—΄μ˜ 맨 μ•žμ— μ΅œλŒ€κ³΅μ•½μˆ˜, κ·Έλ‹€μŒ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό λ„£μ–΄ λ°˜ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 두 수 3, 12의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 3, μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” 12μ΄λ―€λ‘œ solution(3, 12)λŠ” [3, 12]λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

μ œν•œ 쑰건
  • 두 μˆ˜λŠ” 1이상 1000000μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예
n m return
3 12 [3, 12]
2 5 [1, 10]

 

λ‚΄ 문제 풀이
func solution1(_ n:Int, _ m:Int) -> [Int] {
    var max = 0 // μ΅œλŒ€κ³΅μ•½μˆ˜
    var a = 0 // μž…λ ₯받은 수 쀑에 더 큰 수
    
    // 더 큰 수λ₯Ό λ³€μˆ˜ a에 λ„£μŒ
    if n > m {
        a = n
    }
    else {
        a = m
    }
    
    // μ΅œλŒ€κ³΅μ•½μˆ˜ κ΅¬ν•˜λŠ” 반볡문
    // 더 큰 수 aκ°€ 0이 될 λ•ŒκΉŒμ§€ 1μ”© -ν•˜λ©° n, m을 a둜 λ‚˜λˆ λ³΄λ‹€κ°€ 두 수 λͺ¨λ‘ λ‚˜λˆ λ–¨μ–΄μ§ˆ λ•Œ μ’…λ£Œ
    while a > 0 {
        if (n%a == 0 && m%a == 0) {
            max = a
            break
        }
        else {
            a -= 1
        }
    }
    
    // λ°˜λ³΅λ¬Έμ„ 톡해 κ΅¬ν•œ μ΅œλŒ€κ³΅μ•½μˆ˜, 그리고 μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό μ΄μš©ν•œ μ΅œμ†Œκ³΅λ°°μˆ˜ κ΅¬ν•˜λŠ” 곡식을 μ‚¬μš©ν•˜μ—¬ λ°°μ—΄ 리턴
    return [max, n*m/max]
}
  • μž…λ ₯받은 두 μˆ˜μ€‘μ— 큰 수λ₯Ό νŒλ³„ν•˜κ³ , μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•œ λ‹€μŒ μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό μ΄μš©ν•œ κ³΅μ‹μœΌλ‘œ ν•΄κ²°ν–ˆλ‹€.
  • μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 큰 수 aλΆ€ν„° μž…λ ₯ 받은 두 수λ₯Ό λ‚˜λˆ λ³΄λ‹€κ°€ 두 수 λͺ¨λ‘ λ‚˜λˆ λ–¨μ–΄μ§ˆ λ•Œλ₯Ό κ΅¬ν–ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μƒκ°ν•΄λ³΄λ‹ˆ ꡳ이 큰 수둜 λ‚˜λˆ„μ§€ μ•Šκ³  μž‘μ€ μˆ˜λΆ€ν„° λ‚˜λˆ λ„ κ°€λŠ₯ν•œλ°,, κ·Έλ ‡κ²Œ ν•˜λ©΄ 효율이 훨씬 쒋아진닀.

 


 

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

func solution(_ n:Int, _ m:Int) -> [Int] {
    var min = 0
    var max = 0
    
    if n > m { max = n; min = m }
    else { max = m; min = n }
    
    var gcd = min
    
    while gcd != 1 {
        if max % gcd == 0 && min % gcd == 0 {
            break
        }
        
        gcd -= 1
    }
    
    return [gcd, m*n/gcd]
}
  • 두 μˆ˜μ€‘ 더 μž‘μ€ 수둜 두 수λ₯Ό λ‚˜λˆ μ£Όλ©° λͺ¨λ‘κ°€ λ‚˜λˆ λ–¨μ–΄μ§ˆ λ•Œ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν–ˆλ‹€.
  • 첫 번째둜 ν’€μ—ˆλ˜ μ½”λ“œλ³΄λ‹€ 훨씬 κ°„κ²°ν•˜κ²Œ 잘 ν‘Ό λ“― ν•˜λ‹€.

 


 

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

func solution(_ n:Int, _ m:Int) -> [Int] {
    var gcd = 0
    var min = 0
    n > m ? (min = m) : (min = n)
    for i in (1...min).reversed() { if n%i==0 && m%i==0 { gcd = i; break } }
    return [gcd, (n*m)/gcd]
}
  • λ‘œμ§μ€ 거의 λΉ„μŠ·ν•˜μ§€λ§Œ if, else λŒ€μ‹  μ‚Όν•­μ—°μ‚°μžλ₯Ό μ‚¬μš©ν–ˆκ³ , while λŒ€μ‹  reversed λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ for문으둜 λ°˜λ³΅λ¬Έμ„ λŒλ Έλ‹€.
  • 가독성도 훨씬 μ’‹κ³  맀우 κ°„κ²°ν•΄μ‘Œλ‹€.

 


 

문제

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

λŒ“κΈ€