[프로그래머스 / Level3] 보석 쇼핑 (Java)

wannabeking·2022년 7월 1일
0

코딩테스트

목록 보기
23/155

getOrDefault() : 해시 맵에 있으면 가져오고 없으면 default 반환하는 메소드

문제 보기



사용한 것

  • 연속적으로 진열 된 보석을 구입할 때 모든 보석을 구매하기 위한 최소 구간을 구하기 위해 투 포인터 사용
  • 보석이름, 구간별 보석의 수를 쌍으로 저장하기 위한 해시 맵


풀이 방법

  • 투포인터를 사용하여 현재 r의 개수를 증가
  • while 문을 돌며 l의 개수가 2 이상이면 감소, l++
  • 모든 보석 종류를 모았고 이전에 구한 구간보다 길이가 짧으면 answer 교체
  • r++


코드

class Solution {

    public int[] solution(String[] gems) {
        Set<String> set1 = new HashSet<>(List.of(gems));
        Set<String> set2 = new HashSet<>();
        Map<String, Integer> map = new HashMap<>();
        int l = 0;
        int r = 0;
        int len = Integer.MAX_VALUE;
        int[] answer = new int[2];
        while (r < gems.length) {
            map.put(gems[r], map.getOrDefault(gems[r], 0) + 1);
            set2.add(gems[r]);
            while (map.get(gems[l]) > 1) {
                map.replace(gems[l], map.get(gems[l]) - 1);
                l++;
            }
            if (r - l < len && set1.size() == set2.size()) {
                answer[0] = l + 1;
                answer[1] = r + 1;
                len = r - l;
            }
            r++;
        }
        return answer;
    }
}


profile
내일은 개발왕 😎

0개의 댓글