[프로그래머스 C++] 후보키
[프로그래머스 C++] 후보키
https://school.programmers.co.kr/learn/courses/30/lessons/42890
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해결전략
비트마스킹 Bit Masking
이 문제는 결국 풀지 못하고 다른 사람의 풀이를 봤다.
비트마스킹 방법을 사용하면 비교적 간단히 풀 수 있는 문제였다.
정답코드 - 비트마스킹 사용
#include <iostream> #include <string> #include <vector> #include <set> using namespace std; vector<int> candidate; // 후보 키 bool isUnique(int k) // 후보 키가 유일한지 확인하는 함수 { for (int i = 0; i < candidate.size(); i++) // 지금까지 찾은 후보 키를 모두 확인 { // 현재 키 k가 기존 후보 키를 포함하고 있으면 유일하지 않음 if ((k & candidate[i]) == candidate[i]) return false; } return true; // 어떤 후보 키도 현재 키 k에 포함되지 않으면 유일함 } int solution(vector<vector<string>> relation) { int row = relation.size(); int col = relation[0].size(); for (int i = 1; i < (1 << col); i++) { set<string> store; // 각 조합의 행을 저장할 셋 for (int y = 0; y < row; y++) { string temp; // 열 값의 조합을 저장할 임시 문자열 for (int x = 0; x < col; x++) { // i의 x번째 비트가 설정되어 있으면, 해당 열을 조합에 포함 if (i & (1 << x)) { temp += relation[y][x]; // 열 값을 temp에 추가 } } store.insert(temp); // 조합을 store 셋에 삽입 } if (store.size() == row) { // 모든 행이 이 열 조합에서 유일하면 if (isUnique(i)){ // 이 조합이 유일한지 확인 candidate.push_back(i); // 조합을 후보 키 목록에 추가 } } } return candidate.size(); }
다른 방법의 풀이 참조
https://non-stop.tistory.com/650
'⭐ 코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 C++] 불량 사용자 (0) | 2024.07.23 |
---|---|
[프로그래머스 C++] 디스크 컨트롤러 (0) | 2024.07.19 |
[프로그래머스 C++] 스티커 모으기(2) (1) | 2024.07.16 |
[프로그래머스 C++] 숫자 게임 (0) | 2024.07.15 |
[프로그래머스 C++] 베스트앨범 (0) | 2024.07.09 |
댓글
이 글 공유하기
다른 글
-
[프로그래머스 C++] 불량 사용자
[프로그래머스 C++] 불량 사용자
2024.07.23[프로그래머스 C++] 불량 사용자 https://school.programmers.co.kr/learn/courses/30/lessons/64064 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 해결전략 백트래킹(Backtracking), 집합(Set), 조합(combinations) 해결 방법bool isMatch 함수: user ID가 banned ID과 일치하는지 확인하는 bool 함수 생성.백트래킹을 통한 조합 생성: 가능한 모든 조합을 생성하고 조건을 만족하는지 확인하는 함수 작성.중복 제거: 결과 조합에서 중복된 것을 제거하여 최종 답을 구… -
[프로그래머스 C++] 디스크 컨트롤러
[프로그래머스 C++] 디스크 컨트롤러
2024.07.19[프로그래머스 C++] 디스크 컨트롤러 https://school.programmers.co.kr/learn/courses/30/lessons/42627 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 해결전략 힙 Heap, 우선순위 큐 Priority Queue 정답코드 #include #include #include using namespace std;bool Compare(const vector& a, const vector& b) { if (a[1] == b[1]) return a[0] > jobs) { int n = jobs.size(… -
[프로그래머스 C++] 스티커 모으기(2)
[프로그래머스 C++] 스티커 모으기(2)
2024.07.16[프로그래머스 C++] 스티커 모으기(2) https://school.programmers.co.kr/learn/courses/30/lessons/12971 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 해결전략 동적계획법 Dynamic Programming 정답코드 #include #include using namespace std;int solution(vector sticker){ int n = sticker.size(); vector dp1(n); // 첫번째 선택O vector dp2(n); // 첫번째 선택X dp1[0] … -
[프로그래머스 C++] 숫자 게임
[프로그래머스 C++] 숫자 게임
2024.07.15[프로그래머스 C++] 숫자 게임 https://school.programmers.co.kr/learn/courses/30/lessons/12987 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 해결전략 투 포인터 Two Pointer 정답 코드 #include #include #include using namespace std;int solution(vector A, vector B) { sort(A.begin(), A.end()); sort(B.begin(), B.end()); int answer = 0; int p1 =…
댓글을 사용할 수 없습니다.