투 포인터 문제. 딕셔너리를 통해 보석 종류를 카운팅, 보석 별 현재 포인터 범위 안에 해당 보석이 몇 개 있는지 파악할 수 있다. 최소 1개만 있으면 만족한다는 뜻이다. 만일 모든 보석 종류를 포함한다면, 줄일 수 있을 때까지 투 포인터의 범위를 줄인다. 줄일 수 있을 때까지 줄였다면, '가장 작은 범위' + '가장 빨리 시작하는' 구간을 기록한다.
import Foundation
func solution(_ gems:[String]) -> [Int] {
var result = [1, gems.count]
var start = 0
var end = 0
var gemDict = [String:Int]()
let gemTotalCount = Set(gems).count
while end < gems.count {
let gem = gems[end]
let gemCount = gemDict[gem] ?? 0
gemDict[gem] = gemCount + 1
end += 1
if gemDict.count == gemTotalCount {
while start < end {
let gem = gems[start]
let gemCount = gemDict[gem] ?? -1
if gemCount > 1 {
gemDict[gem] = gemCount - 1
start += 1
} else {
if end - start <= result[1] - result[0] {
result = [start + 1, end]
}
break
}
}
}
}
return result
}