문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

문제 접근

  • 특정 구간에 모든 종류의 보석들이 포함되어 있는가를 묻는 문제이다.
  • 보석들의 진열은 중복된 보석들이 존재할 수 있기 때문에 종류를 파악하기 위해 HashSet을 사용하였다. 또한 구간 내에 존재하는 각 보석의 종류와 그 갯수를 확인하기 위해 HashMap을 사용하였다.
  • 투 포인터를 활용하는 곳은 HashMap의 size 즉 현재 구매한 보석의 종류들이 HashSet의 크기, 즉 진열장에 있는 모든 종류의 보석들과 동일한가를 확인한다.
  • 만약 그렇지 않고 적다면, 다음 요소를 구매하면 된다. 즉 right를 하나 올린다.
  • 만약 동일하다면, 그 지점부터 구간을 하나씩 줄여나간다. 즉 left를 하나 올린다.
import java.util.*;

class Solution {
    public int[] solution(String[] gems) {
        int[] answer = new int[2];
        HashSet<String> set = new HashSet<>();
        
        for(int i = 0; i < gems.length; i++){
            set.add(gems[i]);
        }
        
        int start = 0;
        int end = 0;
        
        HashMap<String, Integer> boughtGem = new HashMap<>();
        int length = Integer.MAX_VALUE;
        
        while(true){           
            if(boughtGem.size() >= set.size()){
                int remainGem = boughtGem.get(gems[start]);
                
                if(remainGem == 1){
                    boughtGem.remove(gems[start]);
                } else{
                    boughtGem.put(gems[start], remainGem - 1);
                }
                
                start++;
            } else if(end >= gems.length){
                break;
            } else{
                boughtGem.put(gems[end], boughtGem.getOrDefault(gems[end], 0) + 1);
                end++;
            }
            
            if(boughtGem.size() == set.size()){
                if(end - start < length){
                    length = end - start;
                    answer[0] = start + 1;
                    answer[1] = end;
                }
            }
        }
        
        return answer;
    }
}
  • 쇼핑한 보석들은 각 종류별로 몇개씩 구매되었을 것이다. 만약 여기서 left를 올려 하나씩 뺀다면 해당 보석의 개수가 하나 빠지는 것이고, 그 보석의 개수가 1개였다면 쇼핑목록에서 빠지도록 구현하면 된다.

'Algorithm > Two Pointer' 카테고리의 다른 글

투 포인터 활용 - BOJ 2470 두 용액  (0) 2023.03.19
투 포인터 - BOJ - 1806 부분합  (0) 2023.03.19
투 포인터의 원리와 예제  (0) 2023.03.19
복사했습니다!