[PS][Programmers][Swift] 보석 쇼핑

.onNext("Volga")·2021년 5월 4일
0

ProblemSolving

목록 보기
13/15
  • 투포인터로 풀수 있는문제입니다.
  • 간단하게 생각하면 Gem 의 모든 보석들을 모두 가질떄까지 앞으로 나갑니다.
  • 만약 다 채웠다면, 이제 쓸모 없는것들을 제거해야겠죠.
  • 그 때부터 left를 += 1 해주는 겁니다.
  • 이러한 방식으로 가장 작은 길이를 찾고, 그에 해당하는 답을 채워나가면 됩니다.
import Foundation

func solution(_ gems:[String]) -> [Int] {
    var Gem: [String: Int] = [String: Int]()
    for gem in gems{
        if let v = Gem[gem] {
            Gem[gem] = 0
        }else{
            Gem[gem] = 0
        }
    }
    var ans = 987654321
    var arr: [Int] = []
    var left = 0
    var right = 0
    var totCnt = 0
    while left <= right{
        if totCnt < Gem.count {
            if right == gems.count {
                break
            }
            if let v = Gem[gems[right]] {
                if v == 0 {
                    totCnt += 1
                }
                Gem[gems[right]] = v + 1
            }
            right += 1
        }else{
            if let v = Gem[gems[left]] {
                if v == 1{
                    totCnt -= 1
                }
                Gem[gems[left]] = v - 1
            }
            left += 1
        }

        if right - left < ans && totCnt == Gem.count{
            ans = right - left
            arr = [left + 1, right]
        }
    }
    return arr
}
profile
iOS 개발자 volga입니다~

0개의 댓글