본문 바로가기
📖 Coding Test/Programmers LV.1

[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를 반환한다.)
반응형

댓글