์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Programmers Level 3 ] ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž

KIMHYEYUN 2021. 9. 28. 15:11
๋ฐ˜์‘ํ˜•

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

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž

๊ฐœ๋ฐœํŒ€ ๋‚ด์—์„œ ์ด๋ฒคํŠธ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” "๋ฌด์ง€"๋Š” ์ตœ๊ทผ ์ง„ํ–‰๋œ ์นด์นด์˜ค์ด๋ชจํ‹ฐ์ฝ˜ ์ด๋ฒคํŠธ์— ๋น„์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹น์ฒจ์„ ์‹œ๋„ํ•œ ์‘๋ชจ์ž๋“ค์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‘๋ชจ์ž๋“ค์„ ๋”ฐ๋กœ ๋ชจ์•„ ๋ถˆ๋Ÿ‰

programmers.co.kr

 

๋ฌธ์ œ


๊ฐœ๋ฐœํŒ€ ๋‚ด์—์„œ ์ด๋ฒคํŠธ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” "๋ฌด์ง€"๋Š” ์ตœ๊ทผ ์ง„ํ–‰๋œ ์นด์นด์˜ค์ด๋ชจํ‹ฐ์ฝ˜ ์ด๋ฒคํŠธ์— ๋น„์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹น์ฒจ์„ ์‹œ๋„ํ•œ ์‘๋ชจ์ž๋“ค์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‘๋ชจ์ž๋“ค์„ ๋”ฐ๋กœ ๋ชจ์•„ ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด์„œ ๋‹น์ฒจ ์ฒ˜๋ฆฌ ์‹œ ์ œ์™ธํ•˜๋„๋ก ์ด๋ฒคํŠธ ๋‹น์ฒจ์ž ๋‹ด๋‹น์ž์ธ "ํ”„๋กœ๋„" ์—๊ฒŒ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์•„์ด๋”” ์ค‘ ์ผ๋ถ€ ๋ฌธ์ž๋ฅผ '*' ๋ฌธ์ž๋กœ ๊ฐ€๋ ค์„œ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ฆฌ๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž ํ•˜๋‚˜์— '*' ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ  ์•„์ด๋”” ๋‹น ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ '*' ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
"๋ฌด์ง€"์™€ "ํ”„๋กœ๋„"๋Š” ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์— ๋งคํ•‘๋œ ์‘๋ชจ์ž ์•„์ด๋””๋ฅผ ์ œ์žฌ ์•„์ด๋”” ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฒคํŠธ์— ์‘๋ชจํ•œ ์ „์ฒด ์‚ฌ์šฉ์ž ์•„์ด๋”” ๋ชฉ๋ก์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด

์‘๋ชจ์ž ์•„์ด๋””

frodo
fradi
crodo
abc123
frodoc

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋”” ๋ชฉ๋ก์ด ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ,

๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž

fr*d*
abc1**

๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž์— ๋งคํ•‘๋˜์–ด ๋‹น์ฒจ์—์„œ ์ œ์™ธ๋˜์–ด์•ผ ์•ผ ํ•  ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์žฌ ์•„์ด๋””

frodo
abc123

์ œ์žฌ ์•„์ด๋””

fradi
abc123

์ด๋ฒคํŠธ ์‘๋ชจ์ž ์•„์ด๋”” ๋ชฉ๋ก์ด ๋‹ด๊ธด ๋ฐฐ์—ด user_id์™€ ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋”” ๋ชฉ๋ก์ด ๋‹ด๊ธด ๋ฐฐ์—ด banned_id๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋‹น์ฒจ์—์„œ ์ œ์™ธ๋˜์–ด์•ผ ํ•  ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์€ ๋ช‡๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ


  • user_id ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ 8 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • user_id ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ 8 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ์‘๋ชจํ•œ ์‚ฌ์šฉ์ž ์•„์ด๋””๋“ค์€ ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์‘๋ชจํ•œ ์‚ฌ์šฉ์ž ์•„์ด๋””๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ ์ˆซ์ž๋กœ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • banned_id ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ user_id ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • banned_id ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ 8 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋””๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ ์ˆซ์ž, ๊ฐ€๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฌธ์ž '*' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋””๋Š” '*' ๋ฌธ์ž๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋”” ํ•˜๋‚˜๋Š” ์‘๋ชจ์ž ์•„์ด๋”” ์ค‘ ํ•˜๋‚˜์— ํ•ด๋‹นํ•˜๊ณ  ๊ฐ™์€ ์‘๋ชจ์ž ์•„์ด๋””๊ฐ€ ์ค‘๋ณตํ•ด์„œ ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก๋“ค์„ ๊ตฌํ–ˆ์„ ๋•Œ ์•„์ด๋””๋“ค์ด ๋‚˜์—ด๋œ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ์•„์ด๋”” ๋ชฉ๋ก์˜ ๋‚ด์šฉ์ด ๋™์ผํ•˜๋‹ค๋ฉด ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•˜๋‚˜๋กœ ์„ธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ’€์ด


DFS๋ฅผ ์ด์šฉํ•ด ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด์„œ ํ‘ผ ๋ฌธ์ œ

๋‚˜์˜ ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์ด์ง€๋งŒ,  DFS / BFS ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ์—์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

LinkedList<String> tmp = new LinkedList<>();
            for(String l : list)
                tmp.add(l);
            
            Collections.sort(tmp);

            if(!set.contains(tmp)){
                set.add(tmp);
                answer++;
            }

์ด๋Ÿฐ ์‹์œผ๋กœ ๋‹ด์€ list๋ฅผ ๋‹ค์‹œ tmp๋กœ ์˜ฎ๊ฒจ์ค€ ํ›„์— ์ •๋ ฌํ•œ ์ด์œ  ๐Ÿ‘‰ ํ˜ธ์ถœ๋œ ์ด๋ฒˆ DFS๊ฐ€ return ๋œ ํ›„ ๋งˆ์ง€๋ง‰์— ๋‹ด์€ id๋ฅผ ์‚ญ์ œํ•ด์ฃผ๋Š”๋ฐ list๊ฐ€ ์ •๋ ฌ๋˜๋ฉด ์ˆœ์„œ๊ฐ€ ๊ผฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

์ˆ˜์ •ํ•˜๋ฉด์„œ ์‚ญ์ œ๋ฅผ ๊นŒ๋จน์—ˆ๋Š”๋ฐ answer++์€ ์˜๋ฏธ์—†....ใ…Ž

 

์ฝ”๋“œ


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class ๋ถˆ๋Ÿ‰์‚ฌ์šฉ์ž {
    static boolean[] isVisited;
    static Set<LinkedList<String>> set;
    static LinkedList<String> list;
    static int answer;

    public static int solution(String[] user_id, String[] banned_id) {
        answer = 0;
        isVisited = new boolean[user_id.length];
        set = new HashSet<>();
        list = new LinkedList<>();

        DFS(0, user_id, banned_id);

        return set.size();
    }

    private static void DFS(int cnt, String[] user_id, String[] banned_id) {

        if(cnt == banned_id.length){
            // ์ •๋ ฌ์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— return ๋œ ํ›„, ๋งˆ์ง€๋ง‰ ์‚ญ์ œ์‹œ ๋‹ค๋ฅธ ๊ฒƒ์ด ์‚ญ์ œ๋˜๊ธฐ๋•Œ๋ฌธ
            LinkedList<String> tmp = new LinkedList<>();
            for(String l : list)
                tmp.add(l);
            
            Collections.sort(tmp);

            if(!set.contains(tmp)){
                set.add(tmp);
                answer++;
            }
            return;
        }

        for(int i = 0 ; i < user_id.length ; i++){
            if(!isVisited[i] && check(user_id[i], banned_id[cnt])){
                isVisited[i] = true;
                list.addLast(user_id[i]);
                DFS(cnt+1, user_id, banned_id);
                list.removeLast();
                isVisited[i] = false;
            }
        }
    }

    // ๊ธ€์ž์ˆ˜๊ฐ€ ๊ฐ™๊ณ  * ๋ฅผ ์ œ์™ธํ•œ char์ด ์ผ์น˜ํ•˜๋ฉด true
    private static boolean check(String originId, String bannedId) {
        if(originId.length() != bannedId.length())
            return false;

        for(int i = 0 ; i < originId.length() ; i++){
            if(bannedId.charAt(i) != '*' && bannedId.charAt(i) != originId.charAt(i))
                return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String[] user_id = {"frodo", "fradi", "crodo", "abc123", "frodoc"};
        String[] banned_id = {"fr*d*", "*rodo", "******", "******"};

        System.out.println(solution(user_id, banned_id));
    }
    
}

 

728x90
๋ฐ˜์‘ํ˜•