λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 κ°€μž₯ κ°€κΉŒμš΄ 같은 κΈ€μž

by hyebin (Helia) 2023. 3. 16.
λ°˜μ‘ν˜•
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 λͺ¨μŒ

κ°€μž₯ κ°€κΉŒμš΄ 같은 κΈ€μž

문제 μ„€λͺ…

λ¬Έμžμ—΄ sκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, s의 각 μœ„μΉ˜λ§ˆλ‹€ μžμ‹ λ³΄λ‹€ μ•žμ— λ‚˜μ™”μœΌλ©΄μ„œ, μžμ‹ κ³Ό κ°€μž₯ κ°€κΉŒμš΄ 곳에 μžˆλŠ” 같은 κΈ€μžκ°€ μ–΄λ”” μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, s="banana"라고 ν•  λ•Œ, 각 κΈ€μžλ“€μ„ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ 읽어 λ‚˜κ°€λ©΄μ„œ λ‹€μŒκ³Ό 같이 μ§„ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • bλŠ” μ²˜μŒ λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μ²˜μŒ λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • n은 μ²˜μŒ λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μžμ‹ λ³΄λ‹€ λ‘ μΉΈ μ•žμ— aκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • n도 μžμ‹ λ³΄λ‹€ λ‘ μΉΈ μ•žμ— n이 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” μžμ‹ λ³΄λ‹€ λ‘ μΉΈ, λ„€ μΉΈ μ•žμ— aκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄ μ€‘ κ°€κΉŒμš΄ κ²ƒμ€ λ‘ μΉΈ μ•žμ΄κ³ , μ΄λŠ” 2둜 ν‘œν˜„ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ΅œμ’… κ²°κ³Όλ¬Όμ€ [-1, -1, -1, 2, 2, 2]κ°€ λ©λ‹ˆλ‹€.

λ¬Έμžμ—΄ s이 μ£Όμ–΄μ§ˆ λ•Œ, μœ„와 κ°™μ΄ μ •μ˜λœ μ—°μ‚°μ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜ solution을 μ™„μ„±ν•΄ μ£Όμ„Έμš”.

 

μ œν•œ 사항

  • 1 ≤ s의 길이 ≤ 10,000
    • s은 μ˜μ–΄ μ†Œλ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

s result
"banana" [-1, -1, -1, 2, 2, 2]
"foobar" [-1, -1, 1, -1, -1, -1]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • μ§€λ¬Έκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • fλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • oλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • oλŠ” μžμ‹ λ³΄λ‹€ ν•œ μΉΈ μ•žμ— oκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • bλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • aλŠ” 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • r은 처음 λ‚˜μ™”κΈ° λ•Œλ¬Έμ— μžμ‹ μ˜ μ•žμ— κ°™μ€ κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” -1둜 ν‘œν˜„ν•©λ‹ˆλ‹€.

제좜

import Foundation

func solution(_ s:String) -> [Int] {
    var dic = [String: Int]()
    var result = [Int]()
    let s = s.map{String($0)}
    
    for i in 0..<s.count{
        if dic[s[i]] == nil{
            result.append(-1)
        }else{
            result.append(i-dic[s[i]]!)
        }
        dic[s[i]] = i
    }
    
    return result
}
μ•ŒνŒŒλ²³μ„ key둜 μ•ŒνŒŒλ²³μ˜ μœ„μΉ˜λ₯Ό value둜 κ°–λŠ” λ”•μ…”λ„ˆλ¦¬ dic을 μ„ μ–Έν•œλ‹€.
결괏값을 담을 λ°°μ—΄ resultλ₯Ό μ„ μ–Έν•˜κ³ , λ¬Έμžμ—΄ sλ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•œλ‹€.

iλ₯Ό 0λΆ€ν„° s의 ν¬κΈ°κΉŒμ§€ 1μ”© μ¦κ°€μ‹œν‚€λ©° λ°˜λ³΅ν•œλ‹€.
keyκ°€ s의 i번째 μš”μ†ŒμΈ 값이 nil이라면, 처음 λ“±μž₯ν•œ μ•ŒνŒŒλ²³μ΄κΈ° λ•Œλ¬Έμ— result 배열에 -1을 μΆ”κ°€ν•œλ‹€.
nil이 μ•„λ‹ˆλΌλ©΄ ν˜„μž¬ μœ„μΉ˜μΈ iμ—μ„œ 이전 μœ„μΉ˜μΈ dic [s [i]]λ₯Ό λΊ€ ν›„, result 배열에 μΆ”κ°€ν•œλ‹€.
dic [s [i]]의 valueλ₯Ό i둜 μ €μž₯ν•œλ‹€.

λ‹€λ₯Έ 풀이

import Foundation

func solution(_ s: String) -> [Int] {
    return s.enumerated().map { (i, c) in i - (Array(s)[0..<i].lastIndex(of: c) ?? i + 1) }
}
λ¬Έμžμ—΄ sλ₯Ό enumerated() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ index i와 문자 c둜 λ‚˜λˆˆλ‹€.
map ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ i - (λ¬Έμžμ—΄ sμ—μ„œ 0λΆ€ν„° iκΉŒμ§€ 문자 cλ₯Ό κ°–κ³  있으면 λ§ˆμ§€λ§‰ 인덱슀λ₯Ό, μ—†μœΌλ©΄ i+1 ) 연산을 ν•œ ν›„ λ°˜ν™˜ν•œλ‹€.

(ex - banana인 경우 iκ°€ 2이고 cκ°€ n일 λ•Œ, s의 인덱슀 0λΆ€ν„° 2κΉŒμ§€μ—λŠ” n이 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 2-(2+1)둜 -1을 λ°˜ν™˜ν•œλ‹€.
 banana인 경우 iκ°€ 3이고 cκ°€ a일 λ•Œ, s의 인덱슀 0λΆ€ν„° 3κΉŒμ§€μ—λŠ” aκ°€ 1번째 μΈλ±μŠ€μ— μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 3-1둜 2λ₯Ό λ°˜ν™˜ν•œλ‹€.)
λ°˜μ‘ν˜•