[프로그래머스 LV3] 보석 쇼핑

Junyoung Park·2022년 8월 24일
0

코딩테스트

목록 보기
587/631
post-thumbnail

1. 문제 설명

보석 쇼핑

2. 문제 분석

투 포인터 문제. 딕셔너리를 통해 보석 종류를 카운팅, 보석 별 현재 포인터 범위 안에 해당 보석이 몇 개 있는지 파악할 수 있다. 최소 1개만 있으면 만족한다는 뜻이다. 만일 모든 보석 종류를 포함한다면, 줄일 수 있을 때까지 투 포인터의 범위를 줄인다. 줄일 수 있을 때까지 줄였다면, '가장 작은 범위' + '가장 빨리 시작하는' 구간을 기록한다.

3. 나의 풀이

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
}
profile
JUST DO IT

0개의 댓글