티스토리 뷰
문제 설명
문자열 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을 완성해주세요.
제한 조건
내 답안
func solution(_ s:String) -> [Int] {
var first = [Character: Int]()
var result = [Int]()
for (index, i) in s.enumerated() {
if let firstIndex = first[i] {
result.append(index - firstIndex)
} else {
result.append(-1)
}
first[i] = index
}
return result
}
접근 방법
문자열을 순회하면서 각 문자의 위치(index)를 저장하는 딕셔너리를 사용
처음인 index를 저장하고,(firstIndex) 같은 문자를 만났을 때 위치를 계산하면 된다
다른 풀이
func solution(_ s:String) -> [Int] {
return s.enumerated().map { (index, char) in index - (Array(s)[0..<index].lastIndex(of: char) ?? index + 1) }
알게 된 것
다른 사람의 코드가 한 줄로만 되어 있어서 와 대박! 고급 함수를 이렇게 잘 응용했구나 라고 생각했으나 막상 돌려보니 시간이 너무 오래 걸렸다. 짧은 코드가 시간 복잡도를 줄여주는 것은 아니라는 것을 깨달음
'코딩테스트' 카테고리의 다른 글
10월 20일 - 숫자 문자열과 영단어 swift (1) | 2023.10.20 |
---|---|
10월 20일 - 음양 더하기 swift (0) | 2023.10.20 |
10월 19일 - 서울에서 김서방 찾기 swift (0) | 2023.10.19 |
10월 18일 - 행렬의 덧셈 swift (0) | 2023.10.19 |
10월 18일 - 콜라츠 추측 swift (0) | 2023.10.19 |