2019년 카카오 코딩테스트 문제였다.
생각보다 고려할게 많은 문제였다.
내가 고려해야 했던 조건은 아래와 같다.
- 조합으로 모든 Key의 조합을 다 짜본다.
- 어떻게 구현할 지는 자신의 선택, 나는 DFS를 썼다.
- 후보키로 정하기 위해 유일성(Uniqueness)을 검사한다.
- 유일한 후보키가 정해지면, 그 후보키가 포함되는 키는 조합에 낄 수 없다.
- 이 최소성(Minimality) 부분을 구현하는 것이 가장 어려웠다.
- 표의 크기가 얼마 되지 않았기 때문에, 나는 완전탐색으로 검사했다.
- 유일성 검사는 어떻게 진행하는가?
- 중복을 허용하지 않는, Unordered set을 이용했다.
- 자동 정렬이 되는 Set보다 더 빨라서 Unordered를 사용.
- 중복이 없다면, set과 남은 행 갯수가 같을 것!
- 그 때의 Column 조합이 후보키가 된다.
- 그 후보키 조합들을 Vector에 모두 Push back.
- 최소성 검사는 어떻게 진행하는가?
- 후보키 조합이 모인 Vector와 현재 검사중인 조합을 완전탐색한다.
-
ex) 후보키 조합 <0, 13> |
현재 검사중인 조합 123 |
- 0과 123을 검사해서 겹치는 부분 없음. 통과.
- 13과 123을 검사했을 때, 13은 123에 포함되므로 불통.
- 최소성 검사에서 탈락!