<Algorithm> 90. 후보키(카카오2018)
by BFine반응형
1. 후보키(카카오2018)
비트연산을 이용하는 문제
후보키가 될 수 있는 조합을 모두 고르고(유일성) 겹치는 후보키들을 제거한다(최소성)
이 문제를 풀면서 비트연산에 대해 다시 생각하게 되었다. if-else문으로도 만들 수 는 있겟지만 단순 연산만으로 간략하게 구현할 수 있다는 점에서 놀라웠고 문제를 접근할떄 비트연산에 대한 부분도 고려를 해야할 것 같다.
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | import java.util.LinkedList; import java.util.List; import java.util.stream.IntStream; public class Soultion { public static void name(String[][] relation) { List<Integer> list = new LinkedList<>(); int row = relation.length; int col = relation[0].length; /***************** * 연관된 조합 찾기 for Sort * ex) * * A B C AB BC CA ABC * 001 010 100 011 110 101 111 * 1 2 3 2 3 3 3 * A와 연관 1, B와 2 C와 연관 3 *****************/ FuncPrioity pri = (x) ->{ int ret = 0; while(x != 0) { if((x & 1) == 1) { ret++; x = x >> 1; } } return ret; }; /***************** * 후보키 찾기 * * 튜플을 모두 비교한다. (like 서로 번갈아 악수하는 경우) * *****************/ FuncCandidate rda = (r,c,comb) ->{ for(int i = 0; i < r-1 ; i++) { for(int j = i+1; j < r ; j++) { boolean isSame = true; for(int k = 0; k < c ;k ++) { if((comb & 1 << k) == 0) continue; if(!relation[i][k].equals(relation[j][k])) { isSame = false; break; } } if(isSame) return false; // 같으므로 후보키 아님 } } return true; }; IntStream .range(1, 1<<col) .forEach(i->{ if(rda.isCandidate(row, col, i)) { list.add(i); } }); list.stream() .sorted((x,y)->{ int prix = pri.prio(x); int priy = pri.prio(y); if(prix > priy) { return 1; }else if(priy < priy) { return -1; }else { return 0; } }); int ans = 0; while(!list.isEmpty()) { int first = list.remove(0); ans ++; list.removeIf(i->(first & i)==first); } // 유일성을 위해서 조합이 만들어질경우 제거한다. System.out.println(ans); } } @FunctionalInterface interface FuncCandidate{ boolean isCandidate(int row,int col, int combi); } @FunctionalInterface interface FuncPrioity{ int prio(int x); } | cs |
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 92. 1620번 포켓몬 마스터 (0) | 2019.01.26 |
---|---|
<Algorithm> 91. 타일장식물(프로그래머스) (0) | 2019.01.22 |
<Algorithm> 89. twosum(LeetCode) (0) | 2019.01.18 |
<Algorithm> 88. 카펫(프로그래머스) (0) | 2019.01.15 |
<Algorithm> 87. 2512번 예산 (0) | 2019.01.14 |
블로그의 정보
57개월 BackEnd
BFine