[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 보석 쇼핑 (프로그래머스 lv3, 스위프트)

inu 2022. 5. 4. 15:23
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/67258?language=swift

 

코딩테스트 연습 - 보석 쇼핑

["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]

programmers.co.kr

풀이

func solution(_ gems:[String]) -> [Int] {
    
    var start = 0
    var end = 0
    let totalCount = Set(gems).count
    var gemBox = [String:Int]()
    var answer = [1, gems.count]
    
    while end < gems.count {   
        
        gemBox[gems[end], default: 0] += 1 
        
        while start <= end && gemBox[gems[start]]! > 1 {
            gemBox[gems[start]]! -= 1
            start += 1
        }         
        
        let nowCount = gemBox.count
        
        if totalCount == nowCount &&
        answer[1] - answer[0] > end - start {
            answer = [start+1, end+1]
        } 
        
        end += 1
    }
    
    return answer
}
  • 투 포인터 알고리즘을 활용한 문제
  • Set(gems).count을 통해 전체 보석개수를 파악하고 이와 같을 경우 값을 비교하여 answer에 기록함
  • 현재까지의 보석 개수를 기록하는 dictionary를 만들고 여기에 매번 end좌표의 보석을 넣어줌
  • 해당 end좌표에서는 보석들의 중복이 없도록 start좌표를 최대한 늘려줌 (dictionary의 값이 1보다 크면 start를 늘리고 dictionary 내부값을 하나 줄여줌)
  • 이러다가 현재 dictionary 지정값이 전체 보석개수와 같다면 값을 확인하여 대입해줌
반응형