ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋ณด์„ ์‡ผํ•‘ (2020 ์นด์นด์˜ค ์ธํ„ด์‹ญ)

https://programmers.co.kr/learn/courses/30/lessons/67258?language=java 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ณด์„ ์‡ผํ•‘

["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7]

programmers.co.kr

 

๋ฌธ์ œ ์ •๋ฆฌ 

1. ์ง„์—ด๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ์ ์–ด๋„ 1๊ฐœ ์ด์ƒ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ์—ฐ์†๋œ ๊ตฌ๊ฐ„์„ ๊ตฌํ•˜์„ธ์š”. 

2. ๋งŒ์•ฝ ๊ฐ€์žฅ ์งง์€ ์—ฐ์†๋œ ๊ตฌ๊ฐ„์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ๊ตฌ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”. 

3. ์ง„์—ด๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ์ ์–ด๋„ 1๊ฐœ ์ด์ƒ ํฌํ•จํ•˜๋Š” ๊ตฌ๊ฐ„์€ ๋ฌด์กฐ๊ฑด 1๊ฐœ ์ด์ƒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

 

์ ‘๊ทผ ๋ฐฉ๋ฒ• 

์™„์ „ ํƒ์ƒ‰ 

์ด ๋ฌธ์ œ๋Š” ์šฐ์„  ์ •ํ™•๋„ ํ‰๊ฐ€์™€ ํšจ์œจ์„ฑ ํ‰๊ฐ€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํšจ์œจ์„ฑ ํ‰๊ฐ€๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ณดํ†ต ์™„์ „ํƒ์ƒ‰์„ ์ด์šฉํ•˜๋ฉด ์ ˆ๋Œ€ ํ’€ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ์— ์™„์ „ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ตฌ๊ฐ„์„ ํƒ์ƒ‰ํ•˜์—ฌ ๊ฐ€์žฅ ์งง์€ ๊ตฌ๊ฐ„์„ ๊ตฌํ•œ๋‹ค๋ฉด ๋ณด์„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 100,000๊ฐœ ์ด๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋Œ€๋žต 100,000 * 100,000๋ฒˆ loop๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.  ์ฆ‰, ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ๊ตฌํ˜„ ํ•ด๋ดค์ž ์ ˆ๋Œ€๋กœ ํšจ์œจ์„ฑ ํ‰๊ฐ€๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค.

์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ• (์‹คํŒจ) 

์ฒซ๋ฒˆ์งธ ์ƒ๊ฐํ•ด๋‚ธ ๋ฐฉ๋ฒ•์€ ์ •ํ™•๋„ ํ‰๊ฐ€์—์„œ ์ฒ˜์ฐธํžˆ ์‹คํŒจํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋Œ€์ถฉ ๋กœ์ง์„ ์„ค๋ช…ํ•˜์ž๋ฉด 

 

1. ๋ชจ๋“  ๋ณด์„์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜์—ฌ HashMap<๋ณด์„ ์ด๋ฆ„, ๊ฐœ์ˆ˜> gemsMap์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. 

2. ์•ž๋ถ€ํ„ฐ ๋ณด์„์„ ํ•˜๋‚˜์”ฉ ์ œ์™ธํ•˜๋ฉฐ ๋งŒ์•ฝ ์ œ์™ธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ(์ œ์™ธํ•˜๋ฉด ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ)ํ•  ๊ฒฝ์šฐ ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

3. ๋’ค๋ถ€ํ„ฐ ๋ณด์„์„ ํ•˜๋‚˜์”ฉ ์ œ์™ธํ•˜๋ฉฐ ๋งŒ์•ฝ ์ œ์™ธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

4. 2,3๋ฒˆ ๋กœ์ง์„ ๊ฑฐ๊พธ๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค. (๋’ค->์•ž, ์•ž->๋’ค ์ˆœ) 

5. 2,3,4๋ฒˆ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๋‘ ๊ฐ€์ง€์˜ ํ•ด๋‹ต์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

  5-1. ๋งŒ์•ฝ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๊ธธ์ด๊ฐ€ ์งง์€ ํ•ด๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5-2. ๋งŒ์•ฝ ๊ฐ™์„ ๊ฒฝ์šฐ ๋” ์•ž์— ์œ„์น˜ํ•œ ๊ตฌ๊ฐ„์˜ ํ•ด๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 

๋”ฑ ๋ณด๊ธฐ์—” "์–ด? ์™œ ์•ˆ๋ ๊นŒ? ์—ฐ์†๋œ ๊ตฌ๊ฐ„์ด๋‹ˆ๊นŒ ์œ„์˜ ๋กœ์ง์„ ์ ์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€ ์•Š์„๊นŒ?"๋ผ๊ณ  ์ƒ๊ฐ ํ• ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„ ๋กœ์ง์—๋Š” ์•„์ฃผ ์น˜๋ช…์ ์ธ ๊ตฌ๋ฉ์ด ์กด์žฌํ•œ๋‹ค.

 

๋งŒ์•ฝ์— "A", "B" ,"B", "C", "A", "B", "C", "A", "B", "C" ์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด 2,3๋ฒˆ ๋กœ์ง์„ ์ง„ํ–‰ํ•œ ๊ฒฝ์šฐ 

๋งจ ์•ž์ด 1๋ฒˆ์งธ๋ผ๊ณ  ํ•  ๋•Œ [8, 10]๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , 4๋ฒˆ ๋กœ์ง์„ ์ง„ํ–‰ํ•œ ๊ฒฝ์šฐ [1,4]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๊ฒฐ๊ตญ ์ •๋‹ต์œผ๋กœ ๊ธธ์ด๊ฐ€ ์งง์€ [8,10]์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ •๋‹ต์€ [3,5]์ด๋‹ค.  ์• ์ดˆ์— ์œ„์˜ ๋กœ์ง์€ ๋งจ ์•ž, ๋งจ ๋’ค์— ์œ„์น˜ํ•œ ํ•ด๋‹ต๋งŒ ์ฐพ์•„๊ฐ€๋Š” ๋กœ์ง์ธ ๊ฒƒ์ด๋‹ค.  ๋•ก!

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ• (์„ฑ๊ณต) 

๋‘๋ฒˆ์งธ๋กœ ์ƒ๊ฐํ•ด๋‚ธ ๋ฐฉ๋ฒ•์€ ์ •ํ™•๋„ ํ‰๊ฐ€, ํšจ์œจ์„ฑ ํ‰๊ฐ€ ๋ชจ๋‘ ์™„๋ฒฝํ•˜๊ฒŒ ์„ฑ๊ณตํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

1. left, right๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค. 

2. ๋งŒ์•ฝ์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ๊ฐ„์ด๋ฉด ๋’ค์— ์œ„์น˜ํ•œ ๋ณด์„์„ ํ•˜๋‚˜ ๋” ์„ ํƒํ•œ๋‹ค. (right + 1)

3. ๋งŒ์•ฝ์— ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ตฌ๊ฐ„์ด๋ฉด left์— ์œ„์น˜ํ•œ ๋ณด์„์„ ์ œ์™ธ์‹œ์ผœ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  3-1. ๋งŒ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•œ๋‹ค๋ฉด left์— ์œ„์น˜ํ•œ ๋ณด์„์„ ์ œ์™ธ์‹œํ‚จ๋‹ค. (left + 1) 

  3-2. ๋งŒ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๋’ค์— ์œ„์ฐจํ•œ ๋ณด์„์„ ํ•˜๋‚˜ ๋” ์„ ํƒํ•œ๋‹ค. (right + 1) 

 

๋‘๋ฒˆ์งธ๋กœ ์ƒ๊ฐํ•ด๋‚ธ ๋กœ์ง์€ left, right ๋‘ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ๊ฐ„์„ ์ง€์ •ํ•˜์—ฌ ๋งŒ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ตฌ๊ฐ„์ด๋ฉด ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋Œ€๋กœ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ , ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฉด ๋ณด์„์„ ํ•˜๋‚˜ ๋” ์„ ํƒํ•˜์—ฌ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋„๋ก ๋Š˜๋ ค๊ฐ€๋Š” ๋กœ์ง์ด๋‹ค. ์œ„์˜ ๋กœ์ง์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด "ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜"์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉด ๋œ๋‹ค! 

 

๊ตฌํ˜„ 

import java.util.HashMap;

import java.util.Comparator;
import java.util.HashMap;
import java.util.PriorityQueue;

class Solution {
    public int[] solution(String[] gems) {
        int left = 0, right = 0, min = 654321;
        int kinds = getKindsByGems(gems);

        HashMap<String, Integer> gemsMap = new HashMap<>();
        PriorityQueue<int[]> areas = new PriorityQueue<>(Comparator.comparingInt(o -> o[0]));

        gemsMap.put(gems[0], 1);
        while(right < gems.length) {
            if(gemsMap.size() == kinds && min > (right - left)) {
                min = right - left;
                areas.clear();
                areas.add(new int[] {left + 1, right + 1});
            }

            if(gemsMap.size() == kinds && gemsMap.get(gems[left]) > 1) {
                gemsMap.put(gems[left], gemsMap.get(gems[left]) - 1);
                left += 1;
            }
            else {
                right += 1;
                if(right < gems.length) gemsMap.put(gems[right], gemsMap.getOrDefault(gems[right], 0) + 1);
            }
        }

        return areas.peek();
    }

    private Integer getKindsByGems(String[] gems) {
        HashMap<String, Integer> gemsMap = new HashMap<>();
        for (String gem : gems) {
            gemsMap.put(gem, gemsMap.getOrDefault(gem, 0) + 1);
        }

        return gemsMap.size();
    }
}

 

 

๋ฐ˜์„ฑํ•  ์  

์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์ •๋ง ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ฒซ๋ฒˆ์งธ ํ’€์ด ๋ฒ•์„ ์ƒ๊ฐํ•œ ํ›„์— ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๋‘๋ฒˆ์งธ ํ’€์ด ๋ฒ•์„ ๋– ์˜ฌ๋ ธ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ํ’€์ด๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.  ์ด์œ ๋Š” ์˜ˆ์ „๋ถ€ํ„ฐ ์กด์žฌํ•˜๋Š” ๋‚˜์˜ ๊ณ ์งˆ๋ณ‘์ธ "ํ—ˆ๋‘ฅ์ง€๋‘ฅ" ๋•Œ๋ฌธ์ด์˜€๋‹ค. ๋กœ์ง์„ ํ™•์‹คํ•˜๊ฒŒ ์„ค๊ณ„ํ•œ ํ›„์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋– ์˜ฌ๋ ธ๋‹ค๊ณ  ๋ฌด์ž‘์ • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ๊ตฌํ˜„์— ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ๋‹ค. 

 

๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ํ™•์‹คํ•˜๊ฒŒ ๋กœ์ง์„ ์„ค๊ณ„ํ•œ ํ›„์— ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ์ž! ์ œ๋ฐœ!