Skip to content

Latest commit

 

History

History
81 lines (70 loc) · 2.41 KB

File metadata and controls

81 lines (70 loc) · 2.41 KB

프로그래머스 Level2 : 2019 KAKAO BLIND RECRUITMENT 후보키

import java.util.HashSet;
import java.util.ArrayList;
import java.util.Iterator;
class Solution {
    boolean[] isVisited;
    HashSet<String> keySet = new HashSet<>();
    void dfs(String cKey, int index, String[][] relation){
        if(!cKey.equals("")){
            HashSet<String> tupleSet = new HashSet<>();    
            for(int i=0; i<relation.length; i++){
                StringBuilder sb = new StringBuilder();
                for(char c : cKey.toCharArray()){
                    sb.append(relation[i][c-'0']);
                }
                
                if(!tupleSet.add(sb.toString())){
                    for(int j=index; j<isVisited.length; j++){
                        if(!isVisited[j]){
                            isVisited[j] = true;
                            dfs(cKey+j,j,relation);
                            isVisited[j] = false;
                        }
                    }
                    return;
                }
            }
            keySet.add(cKey);
        }
        for(int i=index; i<isVisited.length; i++){
            if(!isVisited[i]){
                isVisited[i] = true;
                dfs(cKey+i,i,relation);
                isVisited[i] = false;
            }
        }
        
    }
    public int solution(String[][] relation) {
        int answer = 0;
        isVisited = new boolean[relation[0].length];
        
        // 유일성
        dfs("",0,relation);
        
        ArrayList<String> keyList = new ArrayList<>();
        
        Iterator<String> iter = keySet.iterator();
        while(iter.hasNext()){
            keyList.add(iter.next());
        }


        // 최소성
        for(int i=0; i<keyList.size(); i++){
            String cKey = keyList.get(i);
            for(int j=0; j<keyList.size(); j++){
                String key = keyList.get(j);
                if(key.equals("X") || key.equals(cKey)) continue;
                for(char c : cKey.toCharArray()){
                    keyList.set(j,key);
                    if(key.indexOf(c)==-1){
                        break;
                    }
                    keyList.set(j,"X");
                }
                
            }
        }
        for(String key : keyList){
            if(!key.equals("X")) answer++;
        }
        
        return answer;
    }
}