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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

 

 

 

๋ฌธ์ œ

์ง„์—ด๋Œ€ ๋ฒˆํ˜ธ 1 2 3 4 5 6 7 8
๋ณด์„ ์ด๋ฆ„ DIA RUBY RUBY DIA DIA EMERAID SAPPAIRE DIA
  • ๋ชจ๋“  ๋ฒ”์œ„์˜ ๋ณด์„ 1๊ฐœ์ด์ƒ ํฌํ•จํ•˜๋Š” ์งง์€ ๊ตฌ๊ฐ„(์‹œ์ž‘์ , ๋์ ) ๊ตฌํ•˜๊ธฐ
    • ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ์‹œ์ž‘ ์ž‘์€ ๊ตฌ๊ฐ„

 

์ œํ•œ์‚ฌํ•ญ

  • ๋ฐฐ์—ด ํฌ๊ธฐ : 1 ์ด์ƒ 100,000 ์ดํ•˜

 

 

 

 

 

ํ’€์ด

๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 10๋งŒ์œผ๋กœ O(N^2)์œผ๋กœ ํ‘ผ๋‹ค๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. ๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ ํˆฌํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘ผ๋‹ค๋ฉด O(N^2)๋ฏธ๋งŒ์œผ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

  • HashSet์œผ๋กœ ์ง„์—ด๋Œ€์— ์žˆ๋Š” ๋ณด์„์˜ ์ข…๋ฅ˜์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ

 ๋ชจ๋“  ๋ณด์„์„ ํฌํ•จํ•˜๋Š” ๊ตฌ๊ฐ„์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์šฐ์„  ๋ณด์„์˜ ์ข…๋ฅ˜๊ฐ€ ์ด ๋ช‡ ๊ฐ€์ง€์ธ์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ณด์„ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ HashSet์— ๋ณด์„์„ ๋‹ด์œผ๋ฉด, ๋ณด์„์˜ ์ข…๋ฅ˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

  • HashMap์— ๋ณด์„๋ณ„ ๊ฐœ์ˆ˜ ์ €์žฅ

 ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ๊ตฌ๊ฐ„ ์•ˆ์— ์–ด๋–ค ๋ณด์„์ด ๋ช‡ ๊ฐœ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋ณด์„๋ณ„๋กœ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด HashMap<string, integer>์— ๋ณด์„๊ณผ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

 

 

  • ํˆฌํฌ์ธํ„ฐ

 ํˆฌํฌ์ธํ„ฐ๋ฅผ ํ’€ ๋•Œ, ํฌ์ธํ„ฐ๋ฅผ ๋ชจ๋‘ ์‹œ์ž‘์ ์— ๋‘๊ณ  ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜, ํฌ์ธํ„ฐ๋ฅผ ์–‘ ๋์— ๋‘๊ณ  ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •ํ•ด์ง„ ์—ฐ์†๋œ ๋ฒ”์œ„๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ํฌ์ธํ„ฐ๋ฅผ ๋ชจ๋‘ ์‹œ์ž‘์ ์— ๋‘๊ณ  ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

 

 

1. right ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉฐ ํƒ์ƒ‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  right์— ํ•ด๋‹นํ•˜๋Š” ๋ณด์„ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

2. left์— ํ•ด๋‹นํ•˜๋Š” ๋ณด์„์ด 1๊ฐœ๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ๊นŒ์ง€, ํ•ด๋‹น ์ข…๋ฅ˜์˜ ๋ณด์„์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐจ๊ฐ์‹œํ‚ค๊ณ , left ํฌ์ธํ„ฐ๋กœ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

3. left ํฌ์ธํ„ฐ ์กฐ์ž‘์ด ๋๋‚˜๊ณ , map์˜ ์‚ฌ์ด์ฆˆ(ํ˜„์žฌ ๊ตฌ๊ฐ„ ์•ˆ ๋ณด์„ ์ข…๋ฅ˜ ์ˆ˜)๊ฐ€ set์˜ ์‚ฌ์ด์ฆˆ(๋ณด์„์˜ ์ข…๋ฅ˜ ์ˆ˜)์™€ ๊ฐ™๊ณ , ๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„์ด๋ฉด, ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.util.*;

class Solution {
    public int[] solution(String[] gems) {
        HashSet<String> set = new HashSet<>(); //๋ณด์„์˜ ์ข…๋ฅ˜
        for(String gem : gems) {
            set.add(gem);
        }
        
        int left = 0;
        int target = set.size(); //๋ชจ๋“  ๋ณด์„ ๊ฐœ์ˆ˜
        int min = 100000; //๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„
        int[] answer = new int[2]; //์‹œ์ž‘๋ฒˆํ˜ธ, ๋๋ฒˆํ˜ธ
        
        HashMap<String, Integer> map = new HashMap<>(); //๋ณด์„, ๊ฐœ์ˆ˜
        
        for(int right = 0; right < gems.length; right++) { //right ํฌ์ธํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰
            map.put(gems[right], map.getOrDefault(gems[right], 0) + 1); //right ํ•ด๋‹น ๋ณด์„ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€
            
            while(map.getOrDefault(gems[left], 0) > 1) { //left ํ•ด๋‹น ๋ณด์„์ด 1๊ฐœ ์ดˆ๊ณผํ• ๋•Œ๊นŒ์ง€ ํฌ์ธํ„ฐ ์ฆ๊ฐ€
                map.put(gems[left], map.get(gems[left]) - 1); //ํ•ด๋‹น ๋ณด์„ ๊ฐœ์ˆ˜ ๊ฐ์†Œ
                left++;
            }
            
            if (map.size() == target && right - left < min) { //๋ชจ๋“  ๋ณด์„ ํฌํ•จ & ๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„ ๋ฐœ๊ฒฌ
                min = right - left;
                answer[0] = left + 1;
                answer[1] = right + 1;
            }
        }
        
        return answer;
    }
}

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

 

๋ฐฐ์šด์ 

giraffe_