λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🐍 Algorithm/μ•Œκ³ λ¦¬μ¦˜-Swift

[μ•Œκ³ λ¦¬μ¦˜/Swift] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μœ„μž₯ (ν•΄μ‹œ)

by Danna 2021. 4. 16.
728x90
728x90

Python3 둜 ν’€μ—ˆλ˜ 문제λ₯Ό Swift 둜 λ‹€μ‹œ ν’€μ–΄λ΄€μ–΄μš”. iOS κ°œλ°œμ„ 쒀더 효율적으둜 ν•˜κΈ°μœ„ν•΄μ„œ Swift 데이터ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜ κ³΅λΆ€μ˜ ν•„μš”μ„±μ„ λŠκΌˆμŠ΅λ‹ˆλ‹€. πŸ€” 'μœ„μž₯' λ¬Έμ œμ— λŒ€ν•œ μ ‘κ·Ό 방법은 이전 ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄μ£Όμ„Έμš”~

 

[μ•Œκ³ λ¦¬μ¦˜/Python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μœ„μž₯ (ν•΄μ‹œ)

μ„œλ‘œ λ‹€λ₯Έ 옷의 μ‘°ν•©μ˜ 수 κ΅¬ν•˜λŠ” 법 πŸ‘€ μ—¬λŸ¬ μ˜μƒλΌλ¦¬μ˜ 쑰합을 κ΅¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ 곱집합을 μƒκ°ν–ˆλ‹€. 곱집합 (데카λ₯΄νŠΈ κ³±)은 각 μ§‘ν•©μ˜ μ›μ†Œλ₯Ό 각 μ„±λΆ„μœΌλ‘œ ν•˜λŠ” νŠœν”Œλ“€μ˜ μ§‘ν•©μœΌλ‘œ A x B 라고

jellysong.tistory.com

βœ”οΈŽ Dictionary λ₯Ό μ΄μš©ν•œ 풀이 방법

μŠ€νŒŒμ΄κ°€ 가진 μ˜μƒλ“€μ΄ λ‹΄κΈ΄ 2차원 λ°°μ—΄ clothes 은 [μ˜μƒμ˜ 이름, μ˜μƒμ˜ μ’…λ₯˜] ν˜•νƒœλ‘œ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ˜μƒμ˜ 이름은 μ€‘λ³΅λ˜μ§€ μ•Šκ³ , μ˜μƒμ˜ μ’…λ₯˜λŠ” 쀑볡될 수 μžˆμŠ΅λ‹ˆλ‹€. πŸ‘€

 

λ¨Όμ €, [μ˜μƒμ˜ μ’…λ₯˜(String): μ˜μƒμ˜ 개수(Int)] ν˜•νƒœλ‘œ λ”•μ…”λ„ˆλ¦¬λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ€¬μ–΄μš”! 

  • μ˜μƒμ˜ 이름은 μ€‘λ³΅λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 개수만 μ„Έλ©΄ λ©λ‹ˆλ‹€.
  • μ˜μƒμ˜ μ’…λ₯˜λŠ” 쀑볡될 수 μžˆμœΌλ―€λ‘œ key κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0으둜 μ΄ˆκΈ°ν™”λ₯Ό ν•˜κ³ , μ‘΄μž¬ν•˜λ©΄ 1을 λ”ν–ˆμŠ΅λ‹ˆλ‹€. 

μ˜μƒμ˜ μ’…λ₯˜μ— ν•΄λ‹Ήν•˜λŠ” 개수λ₯Ό κ΅¬ν•œ λ’€μ—λŠ”, 이 값듀을 톡해 전체 μ‘°ν•©μ˜ 개수λ₯Ό κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€.

  • μ˜μƒμ˜ κ°œμˆ˜κ°€ A, B, C 라면 -> 전체 μ‘°ν•©μ˜ κ°œμˆ˜λŠ” (A+1) * (B+1) * (C+1) - 1 μž…λ‹ˆλ‹€.
  • ν•˜λ‚˜μ”© μž…λŠ” κ²½μš°λ„ ν¬ν•¨ν•˜κΈ° μœ„ν•΄μ„œ num + 1 의 값을 κ³±ν–ˆμŠ΅λ‹ˆλ‹€. 
  • 1 을 λΉΌμ£ΌλŠ” μ΄μœ λŠ”, 곡집합(μ˜·μ„ μ•ˆμž…λŠ”κ²½μš°(?))을 μ œμ™Έν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

전체 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

import Foundation

func solution(_ clothes:[[String]]) -> Int {

    // λ”•μ…”λ„ˆλ¦¬ μ΄ˆκΈ°ν™”
    var clothesDict : [String: Int] = [:]
    for cloth in clothes {
        let key = cloth[1]
        if !clothesDict.keys.contains(key) {
            clothesDict[key] = 0
        }
        clothesDict[key]? += 1
    }

    // μ„œλ‘œ λ‹€λ₯Έ 옷의 μ‘°ν•©μ˜ 개수 κ΅¬ν•˜κΈ°
    var count = 1
    for num in clothesDict.values {
        count *= (num + 1)
    }
    return count-1
}

 

βœ”οΈŽ Map, Filter, Reduce λ₯Ό μ΄μš©ν•œ 풀이 방법

λ‹€λ₯Έ 풀이도 ν•™μŠ΅ν•˜κ³  μ‹Άμ–΄μ„œ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ν’€μ΄μ˜ 상단에 μžˆλŠ” 풀이λ₯Ό μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€.

λ¨Όμ €, compactMap ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œclothes λ°°μ—΄μ—μ„œ μ˜μƒμ˜ μ’…λ₯˜λ§Œ λ”°λ‘œ λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

Set μžλ£Œν˜•μœΌλ‘œ λ§Œλ“  μ΄μœ λŠ” μ˜μƒμ˜ μ’…λ₯˜μ˜ 쀑볡을 μ œκ±°ν•˜κΈ° μœ„ν•©μž…λ‹ˆλ‹€.

πŸ’‘ map, compactMap
map 은 주어진 값을 ν•˜λ‚˜μ”© λ§€ν•‘ν•˜λŠ”λ° μ΄μš©ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 
compactMap 은 map κ³Ό 같은 역할을 ν•˜μ§€λ§Œ nil 을 μ œκ±°ν•˜κ³  μ˜΅μ…”λ„ 바인딩을 ν•΄μ£ΌλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 

이후, μ˜μƒ μ’…λ₯˜μ— ν•΄λ‹Ήν•˜λŠ” 개수λ₯Ό μ„ΈκΈ° μœ„ν•΄μ„œ map, filter ν•¨μˆ˜λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

counts λ°°μ—΄μ˜ 각 μ›μ†Œμ˜ 값은 μ˜μƒ μ’…λ₯˜μ˜ κ°œμˆ˜μ— 1을 λ”ν•œ κ°’μž…λ‹ˆλ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ, 전체 μ˜μƒμ˜ μ‘°ν•© 개수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œ reduce ν•¨μˆ˜λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

counts 배열을 λ°˜λ³΅ν•˜λ©° 각 μ›μ†Œλ“€μ„ κ³±ν•΄μ£Όκ³ , 1을 λΉΌμ£ΌλŠ” κ³Όμ •κ³Ό κ°™μŠ΅λ‹ˆλ‹€.


728x90
728x90