Study with book/Algorithms

[2019 카카오 블라인드 온라인 코딩 테스트] 후보키


 

 

[후보키] https://programmers.co.kr/learn/courses/30/lessons/42890

 

풀고 느낀점

문제를 읽고 대충 부분집합 구해서 풀면 되겠구나 생각했는데, 부분집합 구하는걸 아무리 애를 써도 코딩이 잘 안됐습니다. 그래서 그냥 인터넷에 찾아서 복붙하고 (나중에 실제 코딩 테스트 볼 때 복붙해도 괜찮겠다는 생각입니다. 🤣) 한 반나절 걸려서 푼것 같습니다. 문제가 밑에 있어서 그런지 정답률이 상당히 낮았습니다.

 

문제에서 후보키 조건중에 유일성 / 최소성이 있는데, 여기서 최소성을 가리는데 contains() 메소드를 사용했는데, 18, 19, 20, 22 예제가 계속 틀리다고 나왔습니다. 그래서 그냥 collection으로 풀어서 cotainsAll() 메소드를 사용했는데 다 통과해버렸습니다. 둘 차이가 뭔지 모르긴하겠는데... 너무 지쳐서 그냥 넘어가는 것도... 괜찮지 않을까요.. ㅎㅎ

 

(근데 코드 진짜 개판으로 짠듯... ㅎㅎ)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class Problem4 {
public static void main(String[] args) {
Problem4 problem4 = new Problem4();
System.out.println(problem4.solution(
new String[][]{
{"100", "ryan", "music", "2"},
{"200", "apeach", "math", "2"},
{"300", "tube", "computer", "3"},
{"400", "con", "computer", "4"},
{"500", "muzi", "music", "3"},
{"600", "apeach", "music", "2"}
}
));
}
List<String> sets = new ArrayList<>();
List<String> store = new LinkedList<>();
public int solution(String[][] relation) {
int[] arr = new int[relation[0].length];
for (int i = 0; i< arr.length ; i++) {
arr[i] = i;
}
bit(arr, relation[0].length);
for (String set : sets) {
Set<String> valid = new HashSet<>();
String[] split = set.split(":");
if (split[0].equals("")) {
continue;
}
for (String[] strings : relation) {
StringBuilder value = new StringBuilder();
for (String s : split) {
value.append(strings[Integer.parseInt(s)]);
}
valid.add(value.toString());
}
if (valid.size() == relation.length) {
store.add(set);
}
}
Set<String> rStore = new HashSet<>(store);
for (int i = 0 ; i < store.size(); i++) {
String target = store.get(i);
String[] split = target.split(":");
for (int j = i + 1; j < store.size(); j++) {
String[] s = store.get(j).split(":");
List<String> a = Arrays.asList(s);
if (a.containsAll(Arrays.asList(split))) {
rStore.remove(store.get(j));
}
}
}
return rStore.size();
}
public void bit(int[] arr, int n) {
for (int i = 0; i < 1 << n; i++) {
StringBuilder set = new StringBuilder();
for (int j = 0; j < n; j++) {
if ((i & 1 << j) != 0) {
set.append(arr[j]).append(":");
}
}
sets.add(set.toString());
}
}
}