DevlogπŸ‘©πŸ»‍πŸ’»/Algorithm

[Swift] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Lv.1 : κ³ μ°¨ν•¨μˆ˜ μ—°μŠ΅

yujjne 2024. 2. 15. 17:57

 

Swift μ–Έμ–΄λ‘œ μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€ λ•Œ κ³ μ°¨ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ κ°„λ‹¨ν•˜κ²Œ 풀이할 수 μžˆλ‹€.

λ‚΄κ°€ ν‘Ό ν’€μ΄μ—μ„œ 1μ€„μ§œλ¦¬ μ½”λ“œκ°€ λ˜λŠ” κ±Έ 보며 κ³ μ°¨ν•¨μˆ˜μ— 쑰금 더 μ΅μˆ™ν•΄μ§€κ³  μ—°μŠ΅ν•΄μ•Όκ² λ‹€λŠ” 생각이 μ ˆμ‹€νžˆ λ“€μ—ˆλ‹€.

였늘 ν’€μ—ˆλ˜ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œλ“€μ„ κ³ μ°¨ν•¨μˆ˜λ‘œλ„ μ—°μŠ΅ν•΄ λ³Έ μ½”λ“œλ₯Ό 정리해 λ΄€λ‹€.

 


 

Lv.1 : μˆ˜λ°•μˆ˜λ°•μˆ˜λ°•μˆ˜λ°•μˆ˜λ°•μˆ˜?

πŸ”—λ¬Έμ œ 링크

 

λ‚˜μ˜ 풀이

func solution(_ n:Int) -> String {
    let su = "수"
    let bak = "λ°•"
    var result = ""
    for i in 1...n {
        result += i % 2 == 0 ? bak : su
    }
    return result
}

 

for문으둜 1λΆ€ν„° nκΉŒμ§€μ˜ λ²”μœ„λ₯Ό λ°˜λ³΅ν•˜λ©° 짝수, ν™€μˆ˜λ₯Ό νŒλ³„ν•˜μ—¬  "수"와 "λ°•"을 이어 뢙이도둝 μž‘μ„±ν–ˆλ‹€.

 

 

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

func solution1(_ n:Int) -> String {
    return "\(String(repeating: "μˆ˜λ°•", count: n / 2))\(n % 2 == 0 ? "" : "수")"
}

func solution2(_ n:Int) -> String {
    return (0..<n).map{($0%2==0 ? "수" : "λ°•")}.reduce("",+)
}

 

  • 1. String(repeating:count:) λ©”μ„œλ“œ μ‚¬μš©

repeating : "μˆ˜λ°•" → "μˆ˜λ°•" λ¬Έμžμ—΄ 반볡

count: n/2 → λ°˜λ³΅ 횟수 μ„€μ •

 

μ£Όμ–΄μ§„ μˆ«μžκ°€ ν™€μˆ˜μΌ λ•ŒλŠ” "μˆ˜λ°•" νŒ¨ν„΄μ„ n/2번 λ°˜λ³΅ν•˜κ³ , 짝수일 λ•ŒλŠ” "μˆ˜λ°•" νŒ¨ν„΄μ„ n/2번 λ°˜λ³΅ν•œ 뒀에 "수"λ₯Ό μΆ”κ°€ν•˜λŠ” 방법이닀. repeating을 μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ λ°˜λ³΅ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

 

  • 2. κ³ μ°¨ν•¨μˆ˜ map, reduce μ‚¬μš©

.map{($0%2==0 ? "수" : "λ°•")} →  n회 λ°˜λ³΅ν•˜λŠ” λ²”μœ„μ—μ„œ 각 μš”μ†Œκ°€ μ§μˆ˜μΈμ§€ ν™€μˆ˜μΈμ§€ νŒλ³„ν•˜μ—¬ "수", "λ°•"으둜 λ§€ν•‘

.reduce("", +) → μƒμ„±λœ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό 이어 λΆ™μ—¬ ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜

 

 

Lv.1 : 내적

πŸ”—λ¬Έμ œ 링크

 

λ‚˜μ˜ 풀이

// a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] n은 a,b λ°°μ—΄μ˜ 길이
func solution(_ a:[Int], _ b:[Int]) -> Int {
    let n = a.count
    var result = 0
    for i in 0..<n {
        result += a[i] * b[i]
    }
    return result
}

 

반볡문으둜 λ°°μ—΄μ˜ 길이만큼 μš”μ†Œλ₯Ό λ°˜λ³΅ν–ˆκ³ ,

각 λ°°μ—΄μ˜ 같은 μœ„μΉ˜μ— μžˆλŠ” μš”μ†Œλ₯Ό κ³±ν•˜μ—¬ ν•©μ‚°ν–ˆλ‹€.

 

 

λ‹€λ₯Έ μ‚¬λžŒμ˜ ν’€μ΄πŸ’‘

func solution1(_ a:[Int], _ b:[Int]) -> Int {
    return zip(a, b).map(*).reduce(0, +)
}

 

  • zip ν•¨μˆ˜ : μ£Όμ–΄μ§„ 두 λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό ν•œ 쌍으둜 λ¬Άμ–΄μ£ΌλŠ” μ—­ν• 
  • map(*) : 각 μ‹œν€€μŠ€μ˜ μš”μ†Œλ₯Ό κ³±ν•˜λŠ” μ—­ν•  → (1,4)λŠ” 1*4
  • reduce(0, +) : μ΄μ „κΉŒμ§€μ˜ ν•©μ‚° 값을 μ΄ˆκΈ°κ°’μœΌλ‘œ μ„€μ •ν•˜κ³  각 μš”μ†Œλ₯Ό λ”ν•˜μ—¬ μƒˆλ‘œμš΄ κ°’ λ°˜ν™˜

 

λ”°λΌμ„œ map으둜 μƒμ„±λœ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό ν•©μ‚°ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

μ΄λ ‡κ²Œ λ‹¨μˆœν•˜κ²Œ μ •ν™•ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€λ‹ˆ.. 🫒

 

 

Lv.1 : μ•½μˆ˜μ˜ ν•©

 

πŸ”—λ¬Έμ œ 링크

 

λ‚˜μ˜ 풀이

func solution(_ n:Int) -> Int {
    var result = 0
    guard  n > 0 else { return result }
    for i in 1...n {
        if n % i == 0 {
            result += i
        }
    }
    return result
}

 

λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ n의 μ•½μˆ˜λ₯Ό μ°Ύκ³ , 찾은 μ•½μˆ˜λ₯Ό λ”ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜ν–ˆλ‹€.

 

 

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

func solution(_ n:Int) -> Int {
    return Array(1...n).filter{n % $0 == 0}.reduce(0, +)
}

 

 

  • Array(1...n) : 1λΆ€ν„° nκΉŒμ§€μ˜ 배열을 생성
  • .filter { n % $0 == 0 } : λ°°μ—΄ μ€‘μ—μ„œ λ‚˜λˆ„μ—ˆμ„ λ•Œ λ‚˜λ¨Έμ§€κ°€ 0인 μš”μ†Œλ“€ ν•„ν„°λ§ν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 생성,$0은 λ°°μ—΄μ˜ 각 μš”μ†Œμ΄λ‹€.
  • .reduce(0, +) : ν•„ν„°λ§λœ λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ λͺ¨λ‘ ν•©ν•˜μ—¬ κ²°κ³Όλ₯Ό λ°˜ν™˜

 

 

Lv.1 : λ‚˜λ¨Έμ§€κ°€ 1이 λ˜λŠ” 수 μ°ΎκΈ°

πŸ”—λ¬Έμ œ 링크

 

λ‚˜μ˜ 풀이

func reminder(_ n:Int) -> Int {
    return Array(1...n).filter{n % $0 == 1}.first! // min()
}

 

쑰건에 λ§žλŠ” μš”μ†Œλ₯Ό λͺ¨λ‘ ν•„ν„°λ§ν–ˆλ‹€λŠ” 점이 아쉽긴 ν•˜μ§€λ§Œ κ³ μ°¨ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ λ¬Έμ œμ— μ ‘κ·Όν•΄ λ΄€λ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 숫자 μ€‘μ—μ„œ n을 λ‚˜λˆ„μ—ˆμ„ λ•Œ λ‚˜λ¨Έμ§€κ°€ 1인 수 μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 수λ₯Ό μ°Ύμ•„ λ°˜ν™˜ν•œλ‹€.

 

 

 

Lv.1 : X만큼  κ°„격이 μžˆλŠ” n개의 숫자

πŸ”—λ¬Έμ œ 링크

 

λ‚˜μ˜ 풀이

func solution(_ x:Int, _ n:Int) -> [Int64] {
    // x λΆ€ν„° x만큼 증가 n개
    var numbers: [Int64] = []
    for i in 1...n {
        numbers.append(Int64(x*i))
    }
    return numbers
}

 

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό λ°˜λ³΅ν•˜λ©΄μ„œ x에 iλ₯Ό κ³±ν•œ 값을 numbers 배열에 μΆ”κ°€ν•˜λŠ” λ°©λ²•μœΌλ‘œ ν’€μ—ˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ xλΆ€ν„° μ‹œμž‘ν•˜μ—¬ x만큼 μ¦κ°€ν•˜λŠ” μˆ«μžκ°€ n개 λ§Œλ“€μ–΄μ§„λ‹€.

 

 

λ‹€λ₯Έ μ‚¬λžŒμ˜ ν’€μ΄πŸ’‘

 

func solution(_ x:Int, _ n:Int) -> [Int64] {
    return Array(1...n).map { Int64($0 * x) }
}

 

1λΆ€ν„° nκΉŒμ§€μ˜ 숫자 배열을 μƒμ„±ν•œ ν›„,

λ°°μ—΄μ˜ 각 μš”μ†Œμ— xλ₯Ό κ³±ν•œ 값을 Int64 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.

 

 


 

 

μ§€κΈˆ λ³΄λ‹ˆ 제일 νŽΈν•˜κ²Œ 생각할 수 μžˆλŠ” 문법인 for문을 자주 μ‚¬μš©ν•˜κ²Œ λœλ‹€.

κ³ μ°¨ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 더 κ°„κ²°ν•˜κ³  ν•¨μˆ˜ν˜•μ μΈ μŠ€νƒ€μΌλ‘œ 문제λ₯Ό ν’€μ–΄λ³΄λ €λŠ” μŠ΅κ΄€μ„ κ°€μ Έμ•Όκ² λ‹€.