코테/프로그래머스

[프로그래머스/Level2] 후보키 (JAVA)

imname1am 2024. 4. 8. 17:16
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡  풀이 방식

• DFS

 

필요 자료구조
- 속성 선택 여부 나타내는 배열 bolean[] visited = new boolean[relation[0].length]
- 후보키 목록 List<String> list 

 

 

1. 1부터 N개의 속성을 모두 선택하며 후보키가 가능한지(= 값이 중복되는 게 없는지) 확인한다. (DFS)

: 조합이 만들어지면, 유일성 검사와 최소성 검사한 후, 조합을 추가한다.

 

  1-1) 선택된 속성으로  후보키를 생성한다.

List<Integer> tmpList = new ArrayList<>();	// 임시 후보키 목록
String key = "";    // 후보키

for(int i = 0 ; i < visited.length ; i++) {
    if(visited[i]) {
        key += String.valueOf(i);
        tmpList.add(i);
    }
}

 

 

 

  1-2) 유일성 검사 메소드

Map<String, Integer> map = new HashMap<>();

for(int i = 0 ; i < relation.length ; i++) {
    String str = "";

    for(int j : tmpList) {
        str += relation[i][j];
    }

    if(map.containsKey(str))  return;	// 후보키가 중복되면 리턴
    map.put(str, 0);	// 중복되지 않으면, 목록에 추가
}

 

 

  1-3) 최소성 검사 메소드

for(String s : list) {
    int cnt = 0;

    for(int i = 0 ; i < key.length() ; i++) {
        String subS = String.valueOf(key.charAt(i));

        if(s.contains(subS)) cnt++;
    }

    if(cnt == s.length())   return;
}

 

 

 

2. 후보키 목록의 크기 = 후보키 개수를 정답으로 출력한다.

 

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.util.*;
 
class Solution {
    static String[][] relation;
    static boolean[] visited;   // 속성 선택 여부 나타내는 배열
    static List<String> list = new LinkedList<>();  // 후보키 목록
        
    public int solution(String[][] relation) {
        this.relation = relation;
        
        // 속성 1~N개씩 다 선택해보기
        for(int i = 1 ; i <= relation[0].length ; i++) {
            visited = new boolean[relation[0].length];
           dfs(i, 00);
        }
        
        return list.size(); // 가능한 후보키 개수 리턴
    }
    
    private static void dfs(int target, int idx, int depth) {
        if(depth == target) {
            List<Integer> tmpList = new ArrayList<>();
            String key = "";    // 후보키
            
            // 선택된 속성으로 후보키 생성
            for(int i = 0 ; i < visited.length ; i++) {
                if(visited[i]) {
                    key += String.valueOf(i);
                    tmpList.add(i);
                }
            }
            
           
           // 1. 후보키 유일성 검사
           Map<String, Integer> map = new HashMap<>(); // 문자열, 출현 개수
            for(int i = 0 ; i < relation.length ; i++) {
                String str = "";
                
                for(int j : tmpList) {
                    str += relation[i][j];
                }
                
                if(map.containsKey(str))  return; // 검사하려는 키가 후보키 포함하면 유일성 만족 X
                map.put(str, 0);
            }
            
            // 2. 후보키 최소성 검사
            for(String s : list) {
                int cnt = 0;
                
                for(int i = 0 ; i < key.length() ; i++) {
                    String subS = String.valueOf(key.charAt(i));
                    
                    // 최소성 만족하는지 확인
                    if(s.contains(subS)) cnt++;
                }
                
                if(cnt == s.length())   return;
            }
            
            // 3. 1,2 모두 만족하면 후보키 추가
            list.add(key);
            
            return;
        }
        
        for(int i = idx ; i < visited.length ; i++) {
            if(!visited[i]) {
                visited[i] = true;
                dfs(target, i, depth + 1);
                visited[i] = false;
            }
        }
    }
}
cs

 

 

 

➕ 다른 풀이 방식

 

 

[프로그래머스] 후보키 (JAVA/자바) - 2019 카카오 기출

프로그래머스>코딩테스트 연습>2019 KAKAO BLIND RECRUITMENT>후보키 - https://programmers.co.kr/learn/courses/30/lessons/42890후보키의 개념을 정확하게 이해하고 있지 않아서 헤맸던 문제이다.일단

velog.io

 

 

- 조금 더 가독성 좋고, 이해하기 더 좋았다(?)

 

(Java) 프로그래머스 - 후보키

카카오 문제 치고 문제 설명이 짧아서 쉽게 풀 수 있을 줄 알았는데 꽤나 오래 걸렸다. 데이터 베이스를 공부한 지 오래되어서 후보키의 개념이 생각나지 않았지만 문제 설명을 보고 빠르게 이

rovictory.tistory.com

 

 

[프로그래머스/자바] 후보키 풀이 - 2019 KAKAO BLIND RECRUITMENT

https://school.programmers.co.kr/learn/courses/30/lessons/42890 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

thdbs523.tistory.com


💦 어려웠던 점

- DFS 문제인 건 알았는데, 유일성과 최소성 검사를 어떻게 해야할지 모르겠었다..........

 

 

🧐 새로 알게 된 내용

- 유일성과 최소성 검사하는 방법.. (사실 완벽히 이해하진 못 해서 다시 봐야함)

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[프로그래머스] 후보키(Java 자바)

https://programmers.co.kr/learn/courses/30/lessons/42890# 코딩테스트 연습 - 후보키 [["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","musi

tmdrl5779.tistory.com

 

반응형