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

2022. 7. 26. 22:16·코딩 테스트

카카오 문제 치고 문제 설명이 짧아서 쉽게 풀 수 있을 줄 알았는데 꽤나 오래 걸렸다.

데이터 베이스를 공부한 지 오래되어서 후보키의 개념이 생각나지 않았지만

문제 설명을 보고 빠르게 이해했다.

 

처음에는 먼저 컬럼을 탐색해서 중복이 없다면 조합을 만드는 로직으로 생각했으나

그게 더 복잡한 것 같아서 모든 조합을 만들고 유일성과 최소성을 검사하는 로직으로 구현했다.

매끄럽게 풀었던 문제가 아니라서 조금 찝찝한 느낌이 있다. 기억이 나지 않을 때쯤 다시 풀어봐야겠다.


최종 코드

import java.util.*;
class Solution {
    static int answer;
    static int n,m;
    static List<HashSet<Integer>> candidateKey;
    static String[][] relationCopy;
    public int solution(String[][] relation) {
        relationCopy = relation;
        
        answer = 0;

        // 중복 조합을 고려하여 HashSet 사용
        candidateKey = new ArrayList<>();
        n = relationCopy.length;
        m = relationCopy[0].length;

        // 1부터 m까지 사이즈만큼 조합 생성하기
        for (int i = 1; i < m + 1; i++) {
            combination(0, i, 0, new HashSet<>());
        }

        return answer;
    }
    // 조합 생성 메서드
    static void combination(int idx, int size, int depth, HashSet<Integer> set) {
        // 조합이 만들어지면
        if(depth == size) {
            // 유일성 검사
            if(!unique(set)) {
                return;
            }
            // 최소성 검사
            for (HashSet<Integer> key : candidateKey) {
                if(set.containsAll(key)) {
                    return;
                }
            }
            // 조합을 추가하고 answer 증가
            candidateKey.add(set);
            answer++;
            return;
        }
        // 조합 만들기
        for (int i = idx; i < m; i++) {
            HashSet<Integer> newSet = new HashSet<>(set);
            newSet.add(i);
            idx++;
            combination(idx, size, depth + 1, newSet);
        }
    }
    // 유일성 검사 메서드
    static boolean unique(HashSet<Integer> set) {
        List<String> list = new ArrayList<>();
        // 만들어진 조합으로 중복되는지 검사
        for (int i = 0; i < n; i++) {
            StringBuilder sb = new StringBuilder();
            for (int idx : set) {
                sb.append(relationCopy[i][idx]);
            }
            if(!list.contains(sb.toString())) {
                list.add(sb.toString());
            } else {
                return false;
            }
        }
        return true;
    }
}

'코딩 테스트' 카테고리의 다른 글

(Java) 백준 1991 - 트리 순회  (0) 2022.07.28
(Java) 프로그래머스 - 전력망을 둘로 나누기  (0) 2022.07.27
(Java) 프로그래머스 - 모음사전  (0) 2022.07.22
(Java) 백준 14502 - 연구소  (0) 2022.07.22
(Java) 프로그래머스 - 예상 대진표  (0) 2022.07.20
'코딩 테스트' 카테고리의 다른 글
  • (Java) 백준 1991 - 트리 순회
  • (Java) 프로그래머스 - 전력망을 둘로 나누기
  • (Java) 프로그래머스 - 모음사전
  • (Java) 백준 14502 - 연구소
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 프로그래머스 - 후보키
상단으로

티스토리툴바