프로그래머스 문제 풀이

보석 쇼핑

qazwsxedc9 2022. 8. 16. 23:03

코딩테스트 연습 - 보석 쇼핑 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

투 포인터를 사용하는 문제이다

import java.util.*;

public class programmers_jewel {
    public static void main(String[] args) {
        String [] gems = {"DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"};
        System.out.println(solution(gems));
        gems = new String[]{"AA", "AB", "AC", "AA", "AC"};
        System.out.println(solution(gems));
    }
    public static int[] solution(String[] gems) {
        Set<String> set = new HashSet<>(Arrays.asList(gems)); // 보석의 종류
        Map<String, Integer> map = new HashMap<>(); // 보석의 종류와 각각의 개수를 담음
        int[] answer = new int[2]; // 시작 진열대 번호와 끝 진열대 번호를 담을 배열
        int start = 0;
        int end = 0;
        int min = Integer.MAX_VALUE;
        int length = 0;
        while(true) {
            if(set.size() == map.size()) {  // 모든 보석 종류가 map 안에 다 들어온 경우
                map.put(gems[start],map.get(gems[start])-1);
                if(map.get(gems[start]) == 0) { // 보석이 하나일 떼 제거된 경우 보석을 map 안에서 삭제
                    map.remove(gems[start]);
                }
                start++; // 범위 줄이기
            } else if (end == gems.length) { // 끝까지 탐색한 경우 종료
                break;
            } else { // 보석 종류가 모두 담기지 않은 경우
                map.put(gems[end], map.getOrDefault(gems[end], 0)+1);
                end++;
            }
            if(set.size() == map.size()) {
                length = end - start;
                if(length<min) {
                    min = length;
                    answer[0] = start+1; // 진열대는 1번부터 시작 (인덱스 조심)
                    answer[1] = end;
                    System.out.println(answer[0] + " "+ answer[1]);
                }
            }
        }
        return answer;
    }
}