Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 삼성 SW 역량 테스트
- 2020 카카오 인턴십
- Gold 5
- Level 2
- Level 4
- 코드 리뷰
- SWEA
- Gold 4
- pass
- 백트래킹
- 백준
- c++
- 브루트포스
- Level 3
- 월간 코드 챌린지
- 코드리뷰
- Web
- next_permutation
- DP
- 2019 KAKAO BLIND
- 스택/큐
- 구현
- 부스트코스
- 프로그래머스
- 그리디
- 시뮬레이션
- DFS
- BFS
- level 1
- 2020 KAKAO BLIND
Archives
- Today
- Total
Min:D's Devlog
[프로그래머스][2019 KAKAO BLIND][C++] 후보키 본문
문제
프로그래머스 KAKAO BLIND RECRUITMENT - 후보키 (Level 2)
문제 풀이
접근 방식
이 문제는 2019 카카오 블라인드 채용 1차 코딩테스트 3번 문제로,
주어진 릴레이션의 후보키의 개수를 구하는 문제였다.
이 문제의 정답률은 약 16%로, 지원자들이 다소 어려움을 겪었던 문제라고 한다.
후보키가 되기 위해서는 유일성과 최소성을 만족해야 한다.
우선, next_permutation을 활용하여 주어진 릴레이션의 모든 속성 값 조합을 만들어주었고,
이 조합이 유일성을 만족하는지 unordered_map을 활용하여 확인해주었다.
유일성을 만족하는 조합들에 대해서는 최소성을 만족하는지 확인해주었다.
최소성을 만족하는지는 3중 for문과 find를 사용하여 확인해주었다.
풀이 코드 - C++
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int solution(vector<vector<string>> relation) {
int col = relation[0].size();
int row = relation.size();
int count = 1;
vector<vector<int>> result;
while(count <= col){
vector<int> idx(col);
for(int i = 0; i < count; i++){
idx[col - i - 1] = 1;
}
// 조합 만들기
do{
vector<int> temp;
for(int i = 0; i < col; i++){
if(idx[i] == 1) temp.push_back(i);
}
// 유일성 체크
int temp_len = temp.size();
bool check = true;
unordered_map<string, int> dic;
for(int i = 0; i < row; i++){
string a = "";
for(int j = 0; j < temp_len; j++){
a += relation[i][temp[j]];
}
if(dic[a] == 1){
check = false;
break;
}
dic[a] = 1;
}
if(check){
result.push_back(temp);
}
}while(next_permutation(idx.begin(), idx.end()));
count++;
}
// 최소성 체크
vector<vector<int>> answer;
for(auto uniqueness : result){
bool check2 = true;
for(auto minimality : answer){
int cnt = 0;
for(int a : minimality){
if(find(uniqueness.begin(),uniqueness.end(),a) != uniqueness.end())
cnt++;
}
if(cnt == minimality.size()){
check2 = false;
break;
}
}
if(check2)
answer.push_back(uniqueness);
}
return answer.size();
}
실행 결과
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][2020 카카오 인턴십][C++] 키패드 누르기 (0) | 2020.09.16 |
---|---|
[프로그래머스][2019 KAKAO BLIND][C++] 무지의 먹방 라이브 (0) | 2020.09.15 |
[프로그래머스][2019 KAKAO BLIND][C++] 실패율 (0) | 2020.09.13 |
[프로그래머스][2019 KAKAO BLIND][C++] 오픈채팅방 (0) | 2020.09.12 |
[프로그래머스][2020 KAKAO BLIND][C++] 괄호 변환 (0) | 2020.09.11 |
Comments