3️⃣ Swift/Problem Solving

[Swift Algorithm] μ΅œμ†Ÿκ°’ λ§Œλ“€κΈ° Programmers(Lv.2)

seolhee2750 2021. 6. 24. 17:29
문제 μ„€λͺ…

길이가 같은 λ°°μ—΄ A, B λ‘κ°œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 각 배열은 μžμ—°μˆ˜λ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
λ°°μ—΄ A, Bμ—μ„œ 각각 ν•œ 개의 숫자λ₯Ό 뽑아 두 수λ₯Ό κ³±ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 과정을 λ°°μ—΄μ˜ 길이만큼 λ°˜λ³΅ν•˜λ©°, 두 수λ₯Ό κ³±ν•œ 값을 λˆ„μ ν•˜μ—¬ λ”ν•©λ‹ˆλ‹€. μ΄λ•Œ μ΅œμ’…μ μœΌλ‘œ λˆ„μ λœ 값이 μ΅œμ†Œκ°€ λ˜λ„λ‘ λ§Œλ“œλŠ” 것이 λͺ©ν‘œμž…λ‹ˆλ‹€. (단, 각 λ°°μ—΄μ—μ„œ k번째 숫자λ₯Ό λ½‘μ•˜λ‹€λ©΄ λ‹€μŒμ— k번째 μˆ«μžλŠ” λ‹€μ‹œ 뽑을 수 μ—†μŠ΅λ‹ˆλ‹€.)

예λ₯Ό λ“€μ–΄ A = [1, 4, 2] , B = [5, 4, 4] λΌλ©΄

  • Aμ—μ„œ 첫번째 숫자인 1, Bμ—μ„œ 첫번째 숫자인 5λ₯Ό 뽑아 κ³±ν•˜μ—¬ λ”ν•©λ‹ˆλ‹€. (λˆ„μ λœ κ°’ : 0 + 5(1x5) = 5)
  • Aμ—μ„œ λ‘λ²ˆμ§Έ 숫자인 4, Bμ—μ„œ μ„Έλ²ˆμ§Έ 숫자인 4λ₯Ό 뽑아 κ³±ν•˜μ—¬ λ”ν•©λ‹ˆλ‹€. (λˆ„μ λœ κ°’ : 5 + 16(4x4) = 21)
  • Aμ—μ„œ μ„Έλ²ˆμ§Έ 숫자인 2, Bμ—μ„œ λ‘λ²ˆμ§Έ 숫자인 4λ₯Ό 뽑아 κ³±ν•˜μ—¬ λ”ν•©λ‹ˆλ‹€. (λˆ„μ λœ κ°’ : 21 + 8(2x4) = 29)

즉, 이 κ²½μš°κ°€ μ΅œμ†Œκ°€ λ˜λ―€λ‘œ 29λ₯Ό return ν•©λ‹ˆλ‹€.

λ°°μ—΄ A, Bκ°€ μ£Όμ–΄μ§ˆ λ•Œ μ΅œμ’…μ μœΌλ‘œ λˆ„μ λœ μ΅œμ†Ÿκ°’μ„ return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

 

μ œν•œ 쑰건
  • λ°°μ—΄ A, B의 크기 : 1,000 μ΄ν•˜μ˜ μžμ—°μˆ˜
  • λ°°μ—΄ A, B의 μ›μ†Œμ˜ 크기 : 1,000 μ΄ν•˜μ˜ μžμ—°μˆ˜

 

μž…μΆœλ ₯ 예
A B answer
[1, 4, 2] [5, 4, 4] 29
[1,2] [3,4] 10

 

λ‚΄ 문제 풀이
func solution(_ A:[Int], _ B:[Int]) -> Int {
    var result = 0
    let arrA = A.sorted(by: <) // μ˜€λ¦„μ°¨μˆœ μ •λ ¬
    let arrB = B.sorted(by: >) // λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
    
    for i in 0..<A.count {
        result += arrA[i] * arrB[i]
    }

    return result
}
  • λ¨Όμ € 문제λ₯Ό 보고, ν•œ λ°°μ—΄μ˜ κ°€μž₯ μž‘μ€ μˆ˜μ™€ κ°€μž₯ 큰 수λ₯Ό λ§€μΉ˜ν•΄μ„œ κ³±ν•΄ λˆ„μ ν•˜λ©΄ μ΅œμ†Œκ°’μ΄ λ˜κ² λ‹€κ³  μƒκ°ν–ˆλ‹€.
  • λ”°λΌμ„œ AλŠ” μ˜€λ¦„μ°¨μˆœ, BλŠ” λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ sortν•΄μ£Όμ—ˆκ³ , μˆœμ„œλŒ€λ‘œ κ³±ν•΄μ„œ λˆ„μ ν–ˆλ‹€.

 

πŸ’‘ ν”Όλ“œλ°±
  • μ’€ 더 μ½”λ“œλ₯Ό κ°„κ²°νžˆ μž‘μ„±ν•  수 μžˆμ„ 것도 같은데, λ„μ €νžˆ λ– μ˜€λ₯΄μ§€ μ•Šμ•„ μ΄λ ‡κ²Œ λ§ˆλ¬΄λ¦¬ν–ˆλ‹€.
  • κ³ μ°¨ν•¨μˆ˜ 곡뢀가 더 ν•„μš”ν• λ“― ν•˜λ‹€.

 


 

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

func solution(_ A:[Int], _ B:[Int]) -> Int {
    return zip(A.sorted(), B.sorted(by: >)).map(*).reduce(0, +)
}
  • 첫 번째둜 ν’€μ—ˆμ„ λ•Œμ™€ λ‘œμ§μ€ κ°™λ‹€. ν•œ 배열은 μ˜€λ¦„μ°¨μˆœ, ν•œ 배열은 λ‚΄λ¦Όμ°¨μˆœ sort ν•΄μ£Όμ—ˆλ‹€.
  • zip으둜 두 배열을 λ¬Άμ—ˆκ³ , map을 μ‚¬μš©ν•˜μ—¬ 두 λ°°μ—΄μ˜ μ •λ ¬λœ 값듀을 μˆœμ„œλŒ€λ‘œ κ³±ν•΄μ£Όμ—ˆλ‹€.
  • zip을 κ³΅λΆ€ν•˜κ³  λ‚˜μ„œ, zip을 μ‚¬μš©ν•˜κΈ° λ”± 쒋은 문제인 것 κ°™μ•„ μ‚¬μš©ν•΄λ΄€λ”λ‹ˆ λ„ˆλ¬΄ κ°„κ²°ν•˜κ²Œ 잘 μž‘μ„±λ˜μ—ˆλ‹€!

 


 

문제

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