ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

https://programmers.co.kr/learn/courses/30/lessons/72411

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ฉ”๋‰ด ๋ฆฌ๋‰ด์–ผ

๋ ˆ์Šคํ† ๋ž‘์„ ์šด์˜ํ•˜๋˜ ์Šค์นดํ”ผ๋Š” ์ฝ”๋กœ๋‚˜19๋กœ ์ธํ•œ ๋ถˆ๊ฒฝ๊ธฐ๋ฅผ ๊ทน๋ณตํ•˜๊ณ ์ž ๋ฉ”๋‰ด๋ฅผ ์ƒˆ๋กœ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๋‹จํ’ˆ์œผ๋กœ๋งŒ ์ œ๊ณตํ•˜๋˜ ๋ฉ”๋‰ด๋ฅผ ์กฐํ•ฉํ•ด์„œ ์ฝ”์Šค์š”๋ฆฌ ํ˜•ํƒœ๋กœ ์žฌ๊ตฌ์„ฑํ•ด์„œ

programmers.co.kr

 

๋ฌธ์ œ ์„ค๋ช…

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์†๋‹˜ 6๋ช…์ด ์ฃผ๋ฌธํ•œ ๋‹จํ’ˆ๋ฉ”๋‰ด๋“ค์˜ ์กฐํ•ฉ์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด,
(๊ฐ ์†๋‹˜์€ ๋‹จํ’ˆ๋ฉ”๋‰ด๋ฅผ 2๊ฐœ ์ด์ƒ ์ฃผ๋ฌธํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ ๋‹จํ’ˆ๋ฉ”๋‰ด๋Š” A ~ Z์˜ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.)

 

์†๋‹˜ ๋ฒˆํ˜ธ / ์ฃผ๋ฌธํ•œ ๋‹จํ’ˆ๋ฉ”๋‰ด ์กฐํ•ฉ
1๋ฒˆ ์†๋‹˜ A, B, C, F, G
2๋ฒˆ ์†๋‹˜ A, C
3๋ฒˆ ์†๋‹˜ C, D, E
4๋ฒˆ ์†๋‹˜ A, C, D, E
5๋ฒˆ ์†๋‹˜ B, C, F, G
6๋ฒˆ ์†๋‹˜ A, C, D, E, H

๊ฐ€์žฅ ๋งŽ์ด ํ•จ๊ป˜ ์ฃผ๋ฌธ๋œ ๋‹จํ’ˆ๋ฉ”๋‰ด ์กฐํ•ฉ์— ๋”ฐ๋ผ "์Šค์นดํ”ผ"๊ฐ€ ๋งŒ๋“ค๊ฒŒ ๋  ์ฝ”์Šค์š”๋ฆฌ ๋ฉ”๋‰ด ๊ตฌ์„ฑ ํ›„๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฝ”์Šค ์ข…๋ฅ˜ / ๋ฉ”๋‰ด / ๊ตฌ์„ฑ์„ค๋ช…
์š”๋ฆฌ 2๊ฐœ ์ฝ”์Šค A, C 1๋ฒˆ, 2๋ฒˆ, 4๋ฒˆ, 6๋ฒˆ ์†๋‹˜์œผ๋กœ๋ถ€ํ„ฐ ์ด 4๋ฒˆ ์ฃผ๋ฌธ๋์Šต๋‹ˆ๋‹ค.
์š”๋ฆฌ 3๊ฐœ ์ฝ”์Šค C, D, E 3๋ฒˆ, 4๋ฒˆ, 6๋ฒˆ ์†๋‹˜์œผ๋กœ๋ถ€ํ„ฐ ์ด 3๋ฒˆ ์ฃผ๋ฌธ๋์Šต๋‹ˆ๋‹ค.
์š”๋ฆฌ 4๊ฐœ ์ฝ”์Šค B, C, F, G 1๋ฒˆ, 5๋ฒˆ ์†๋‹˜์œผ๋กœ๋ถ€ํ„ฐ ์ด 2๋ฒˆ ์ฃผ๋ฌธ๋์Šต๋‹ˆ๋‹ค.
์š”๋ฆฌ 4๊ฐœ ์ฝ”์Šค A, C, D, E 4๋ฒˆ, 6๋ฒˆ ์†๋‹˜์œผ๋กœ๋ถ€ํ„ฐ ์ด 2๋ฒˆ ์ฃผ๋ฌธ๋์Šต๋‹ˆ๋‹ค.

[๋ฌธ์ œ]

๊ฐ ์†๋‹˜๋“ค์ด ์ฃผ๋ฌธํ•œ ๋‹จํ’ˆ๋ฉ”๋‰ด๋“ค์ด ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ๋‹ด๊ธด ๋ฐฐ์—ด orders, "์Šค์นดํ”ผ"๊ฐ€ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ฝ”์Šค์š”๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จํ’ˆ๋ฉ”๋‰ด๋“ค์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด course๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, "์Šค์นดํ”ผ"๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋  ์ฝ”์Šค์š”๋ฆฌ์˜ ๋ฉ”๋‰ด ๊ตฌ์„ฑ์„ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

[์ œํ•œ์‚ฌํ•ญ]

  • orders ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 2 ์ด์ƒ 20 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • orders ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ 2 ์ด์ƒ 10 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ๊ฐ ๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ ๋ฌธ์ž์—ด์—๋Š” ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์ค‘๋ณตํ•ด์„œ ๋“ค์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • course ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ 10 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    • course ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋Š” 2 ์ด์ƒ 10 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • course ๋ฐฐ์—ด์—๋Š” ๊ฐ™์€ ๊ฐ’์ด ์ค‘๋ณตํ•ด์„œ ๋“ค์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ •๋‹ต์€ ๊ฐ ์ฝ”์Šค์š”๋ฆฌ ๋ฉ”๋‰ด์˜ ๊ตฌ์„ฑ์„ ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ return ํ•ด์ฃผ์„ธ์š”.
    • ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ์— ์ €์žฅ๋œ ๋ฌธ์ž์—ด ๋˜ํ•œ ์•ŒํŒŒ๋ฒณ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๊ฐ€์žฅ ๋งŽ์ด ํ•จ๊ป˜ ์ฃผ๋ฌธ๋œ ๋ฉ”๋‰ด ๊ตฌ์„ฑ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด, ๋ชจ๋‘ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • orders์™€ course ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” return ํ•˜๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ด ๋˜๋„๋ก ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

[์ž…์ถœ๋ ฅ ์˜ˆ]orders / course / result
["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"] [2,3,4] ["AC", "ACDE", "BCFG", "CDE"]
["ABCDE", "AB", "CD", "ADE", "XYZ", "XYZ", "ACD"] [2,3,5] ["ACD", "AD", "ADE", "CD", "XYZ"]
["XYZ", "XWY", "WXA"] [2,3,4] ["WX", "XY"]

----------------------------------------------------------------------------------------------------------------------

[๋ฌธ์ œ ํ’€์ด]

 

- getCource()

์ฃผ๋ฌธ๋“ค๋งˆ๋‹ค ์ฃผ๋ฌธ ๋ฉ”๋‰ด์˜ ์ด๊ฐœ์ˆ˜ >= ์กฐํ•ฉ์„ ์ง„ํ–‰ํ•  ๊ฐœ์ˆ˜ ์ผ๋•Œ๋งŒ, getMenu()๋ฅผ ํ†ตํ•ด ๋ฉ”๋‰ด๋ฅผ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

- getMenu()

i๋ฒˆ์งธ ์†๋‹˜์˜ ๋‹จํ’ˆ ๋ฉ”๋‰ด๋“ค๋กœ, cnt ํฌ๊ธฐ์˜ ์กฐํ•ฉ์„ ๋ฝ‘์•„๋‚ด์–ด map์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ map์— ํ•ด๋‹น ์กฐํ•ฉ์ด ์ด๋ฏธ ๋“ค์–ด์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์กฐํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ +1ํ•˜์—ฌ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๊ฐฑ์‹ ๋œ ์ด ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’์„ max์— ๊ณ„์† ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

-findMax()

๋ชจ๋“  ์กฐํ•ฉ์ด ์ €์žฅ ์™„๋ฃŒ๋œ map์—์„œ ์ตœ๋Œ€๊ฐ’ max๋งŒํผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”๋‰ด๋ฅผ ์šฐ์„ ์ˆœ์œ„ํ pq์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„, pq์—์„œ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚˜์™€ answer๋ฐฐ์—ด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

[์ •๋‹ต ์ฝ”๋“œ]

import java.util.*;
class Solution {
    public static HashMap<String, Integer> map = new HashMap<String, Integer>();
    public static int max = 0;
    public static PriorityQueue<String> pq = new PriorityQueue<>();
    public String[] solution(String[] orders, int[] course) {
        String[] answer = {};
        for(int i=0;i<course.length;i++) {
            getCourse(course[i], orders);
        }
        answer = new String[pq.size()];
        int index = 0;
        while(!pq.isEmpty()) {
            answer[index] = pq.poll();
            index++;
        }
        return answer;
    }
    public static void getCourse(int count, String[] orders) {
        //์ฃผ๋ฌธ๋“ค ๋งˆ๋‹ค ์ฃผ๋ฌธ๊ฐœ์ˆ˜ >= ์กฐํ•ฉํ•  ๊ฐœ์ˆ˜ ์ด๋ฉด, getMenu()๋ฅผ ์‹คํ–‰
        for(int i=0;i<orders.length;i++) {
            int len = orders[i].length();
            if(len >= count) {
                String[] menu = orders[i].split("");
                // XWA -> AWX
                Arrays.sort(menu);
                boolean[] visit = new boolean[len];
                getMenu(menu, count, "", visit, 0);
            }
        }
        
        //๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”๋‰ด๊ฐ€ map์— ์ถ”๊ฐ€๋จ
        //map์˜ menu์ค‘ ์ตœ๋Œ€๊ฐ’์€ max์— ์ €์žฅ๋จ
        
        // ์ตœ์†Œ 2๋ช… ์ด์ƒ์˜ ์†๋‹˜์—๊ฒŒ์„œ ์ฃผ๋ฌธ๋œ ๊ตฌ์„ฑ๋งŒ ์ฝ”์Šค ๊ฐ€๋Šฅ
        if(max > 1) {
            findMax();
        }
        max = 0;
        map.clear();
    }
    // ๋ฉ”๋‰ด cnt๊ฐœ ์กฐํ•ฉ ๊ฐ€๋Šฅํ•œ๊ฒƒ๋“ค ์ฐพ์•„์„œ map์— (menu, ๊ฐœ์ˆ˜)๋กœ ์ถ”๊ฐ€ํ•จ
    public static void getMenu(String[] menu, int cnt, String set, boolean[] visit, int index) {
        if(set.length() == cnt) {
            if(map.get(set) != null) {
                int newCount = map.get(set) + 1;
                map.put(set, newCount);
                if(max < newCount) {
                    max = newCount;
                }
            } else {
                map.put(set, 1);
            }
            return;
        }
        for(int i=index;i<menu.length;i++) {
            if(!visit[i]) {
                visit[i] = true;
                getMenu(menu, cnt, set + menu[i], visit, i);
                visit[i] = false;
            }
        }
    }
    public static void findMax() {
        for(String key:map.keySet()) {
            if(max == map.get(key)) {
                pq.offer(key);
            }
        }
    }
}