코딩테스트
[프로그래머스] 후보키
nandy
2022. 6. 10. 01:28
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","music","2"]] 2
programmers.co.kr
카카오 블라인드 테스트에서 출제된 문제이고, 프로그래머스 기준 레벨 2 문제입니다.
문제 해결 방식으로 칼럼들의 조합으로 나온 결과물의 중복 여부를 자료구조 set 을 활용해서 체크하고,
만약 중복이 되지 않는다고 가정할 때 최소성까지 있는지를 체크한 다음 최소성을 보유하고 있다면 answer 값에 추가해서 리턴하면 되는 문제입니다.
중복 여부 체크 후 중복이 되지 않는 경우, 최소성 체크할 때 부분집합 비교 과정에서 2진수를 활용하면 도움이 됩니다!
예제 코드는 다음과 같습니다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public static int solution(String[][] relation) {
int answer = 0;
int rowCount = relation.length;
int colCount = relation[0].length;
List<Integer> list = new ArrayList<>();
for (int i = 1; i < (1 << colCount); i++) {
int temp = i;
int index = 0;
boolean[] check = new boolean[colCount];
while(temp > 0) {
if (temp % 2 > 0) check[index] = true;
temp >>= 1;
index++;
}
// 칼럼 집합 계산
Set<String> set = new HashSet<>();
for (int j = 0; j < rowCount; j++) {
String elem = "";
for (int k = 0; k < colCount; k++) {
if (check[k] == true) {
elem += relation[j][k];
}
}
set.add(elem);
}
// 중복이 없는 경우
if (rowCount == set.size()) {
boolean isExist = false;
// 최소성을 만족하는지 체크 (isExist = false -> 최소성 만족)
for (int j = 0; j < list.size(); j++) {
int val = list.get(j);
if ((val & i) == val) {
isExist = true;
}
}
if (!isExist) {
list.add(i);
}
}
}
return list.size();
}
}