๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ›„๋ณดํ‚ค (Java)

by young-ji 2023. 12. 1.

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

 

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

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

programmers.co.kr

import java.util.*;

class Solution {
    public int solution(String[][] relation) {
        int answer = 0;
        int rowCount = relation.length;
        int columnCount = relation[0].length;

        // ์ธ๋ฑ์Šค ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
        List<Integer> arr = new ArrayList<>();
        for (int i = 0; i < columnCount; i ++){
            arr.add(i);
        }

        List<List<Integer>> except = new ArrayList<>();

        for (int i = 1; i <= columnCount; i ++){
            List<List<Integer>> result = new ArrayList<>();
            combination(arr, new boolean[columnCount], 0, i, result); // ์กฐํ•ฉ ๊ตฌํ•˜๊ธฐ
            result = removeExceptCombination(result, except);

            for(List<Integer> indexes : result) {
                Set<String> set = getCombinationContents(relation, indexes);
                if(set.size() == rowCount){
                    answer += 1;
                    except.add(indexes);
                }
            }
        }
        return answer;
    }

    // ๋ฐฑํŠธ๋ž˜ํ‚น ์ด์šฉํ•ด์„œ ์กฐํ•ฉ๊ตฌํ•˜๊ธฐ
    public void combination(List<Integer> arr, boolean[] visit, int start, int r, List<List<Integer>> result){
        if (r == 0){
            List<Integer> visitIndex = new ArrayList<>();
            for (int i = 0; i < visit.length; i++){
                if(visit[i])
                    visitIndex.add(arr.get(i));
            }
            result.add(visitIndex);
            return;
        }else {
            for (int i = start; i< arr.size(); i ++){
                visit[i] = true;
                combination(arr, visit, i + 1, r - 1, result);
                visit[i] = false;
            }
        }
    }

    // ์ธ๋ฑ์Šค ์กฐํ•ฉ set ๊ตฌํ•˜๊ธฐ
    public Set<String> getCombinationContents(String[][] relation, List<Integer> indexes){
        Set<String> result = new HashSet<>();

        for (String[] row : relation){
            String contents = "";
            for (Integer index : indexes){
                contents = contents + row[index];
            }
            result.add(contents);
        }

        return result;
    }

    public List<List<Integer>> removeExceptCombination(List<List<Integer>> target, List<List<Integer>> except) {
        if (except.isEmpty())
            return target;
        List<List<Integer>> remove = new ArrayList<>();
        for (int i = 0; i < target.size(); i ++){
            for (int j = 0; j < except.size(); j++){
                if (target.get(i).containsAll(except.get(j))){
                    remove.add(target.get(i));
                    break;
                }
            }
        }
        target.removeAll(remove);
        return target;
    }
}

 

๋ฐฑํŠธ๋ฆฌํ‚น์œผ๋กœ ์กฐํ•ฉ๊ตฌํ•˜๊ธฐ

 

  • ๊ฑฐ์˜ 3์ค‘ ๋ฐ˜๋ณต๋ฌธ์ธ๋ฐ ํƒ€์ž„์•„์›ƒ๋‚˜์ง€๋Š” ์•Š์•˜๋‹ค.
  • ์ฒ˜์Œ์—๋Š” ํ›„๋ณดํ‚ค๋กœ ํŒ๋ณ„๋œ ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜์”ฉ ๋ชจ๋‘ ์‚ญ์ œํ•ด์คฌ๋Š”๋ฐ ์กฐํ•ฉ์œผ๋กœ ์‚ญ์ œํ•ด์ค˜์•ผ ํ–ˆ๋‹ค.

๋Œ“๊ธ€