Skip to content

[Algorithm] 보석 쇼핑 #162

Description

@hwangJi-dev

💬 문제

https://school.programmers.co.kr/learn/courses/30/lessons/67258


💬 Idea

  • 투포인터를 사용하여 싹쓸이할 수 있는 최소구간을 구하자
  • leftIndex가 rightIndex보다 작거나 같으면서, rightIndex가 보석의 총 개수 -1 보다 작을 때까지 반복문을 돈다.
  • 딕셔너리(map) 구조를 이용하여 모은 보석의 수를 저장한다.
    • 처음에 반복문 안에 배열을 Set해주는 방식으로 구현하니 시간초과가 났었다.
    • 딕셔너리를 활용하여 보석의 개수를 -, + 해주는 방식으로 변경했더니 해결되었다.
  • 모은 보석의 개수가 총 보석 개수와 같다면 leftIndex를 + 1 해주며 구간을 좁히며 최소구간을 찾고,
  • 총 보석 개수보다 모은 보석 개수가 모자라다면 rightIndex를 + 1 해주며 구간을 넓힌다

💬 풀이

func solution(gems:[String])->[Int]{varleftIdx=0varrightIdx=0varminDistance=Int.max
varcollectedGems:[String:Int]=[:]varans:[Int]=[]letgemCnt=Set(gems).count
while leftIdx <= rightIdx && rightIdx < gems.count {ifcollectedGems[gems[leftIdx]]==nil{collectedGems[gems[leftIdx]]=0continue}if collectedGems.count == gemCnt {if minDistance > rightIdx - leftIdx {
minDistance = rightIdx - leftIdx
ans =[leftIdx +1, rightIdx +1]}collectedGems[gems[leftIdx]]! -=1ifcollectedGems[gems[leftIdx]]==0{collectedGems[gems[leftIdx]]=nil}
leftIdx +=1}else{ifcollectedGems[gems[rightIdx]]==nil{collectedGems[gems[rightIdx]]=0}else{collectedGems[gems[rightIdx]]! +=1
rightIdx +=1}}}return ans
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions