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
- Algorithm
- 서버개발캠프
- 투포인터
- 식단
- 유니온파인드
- 삼성 #코테 #2020상반기 #c++
- 코딩테스트
- 카카오인턴
- LIS #Algorithm #요소추적
- c++
- 보석쇼핑
- 카카오
- BaekJoon
- Union-find
- 코테
- 1편
- 알고리즘
- IBK기업은행 #기업은행 #디지털 #직무 #정리
- BFS
- 중반부
- Smilegate
- 소감
- 백준
- 스마일게이트
Archives
- Today
- Total
짱아의 개발 기록장
2021 KAKAO BLIND RECRUITMENT - 메뉴 리뉴얼(c++) 본문
반응형
Bitmask + 조합을 활용해서 풀었다.
설명은 추후 추가 예정
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
114
115
116
|
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int bits[21] = {0, };
map<string, int> kind;
map<string, int> m;
vector<string> v[11];
int visited[11] = {0, };
bool cmp(const pair<int, string>&a, const pair<int, string> &b){
return a.first>b.first;
}
// 각 코스요리 주문에서 조합에 해당되는 메뉴가 있는 지 확인
// s = "AB"이면, "ABCDE" 코스요리에서 "AB"가 있는지 확인 (O)
// s = "CD"이면, "BCFG" 코스요리에는 없다. (X)
void cal(vector<string> orders, vector<int> cours, string s) {
int cnt = 0;
for(int i=0; i<orders.size(); i++){
int cmp = bits[i];
bool check = true;
for(int j=0; j<s.size(); j++){
if((cmp & (1<<(s[j]-'A'))) == 0) {
check = false;
break;
}
}
if(check==true){
cnt++;
}
}
// 각 조합이 몇 번 주문되었는지
m[s] = cnt;
// 개수별로 저장
v[s.size()].push_back(s);
}
// 조합 구하기
void combin(string s, int num, int cnt, int idx, vector<string> orders, vector<int> course) {
if(cnt==num){
string temp = "";
for(int i=0; i<s.size(); i++){
if(visited[i]==true){
temp += s[i];
}
}
// "WX"와 "XW"모두 같은 값이기 때문에 sorting한다.
sort(temp.begin(), temp.end());
if(kind.count(temp)==0){
kind[temp] = 1;
cal(orders, course, temp);
}
return;
}
for(int i=idx; i<s.size(); i++){
if(visited[i]==true) continue;
visited[i] = true;
combin(s, num, cnt+1, i, orders, course);
visited[i] = false;
}
}
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
// 각 주문의 bit값을 구하기
for(int i=0; i<orders.size(); i++){
int temp = 0;
for(int j=0; j<orders[i].size(); j++){
temp |= (1<<(orders[i][j]-'A'));
}
bits[i] = temp;
}
// 각 주문마다 개수에 맞게 조합 구하기
for(int i=0; i<orders.size(); i++){
int idx = 0;
while(1){
if(idx>=course.size()){
break;
}
if(course[idx]<=orders[i].size()){
combin(orders[i], course[idx], 0, 0, orders, course);
}
idx++;
}
}
// 마지막으로, 코스요리가 될 수 있는 구성(개수가 같으면 더 자주 주문된 구성으로)을 선별
for(int i=0; i<course.size(); i++){
int level = course[i];
vector<pair<int, string>> tmp;
for(int j=0; j<v[level].size(); j++){
tmp.push_back(make_pair(m[v[level][j]], v[level][j]));
}
sort(tmp.begin(), tmp.end(), cmp);
for(int i=0; i<tmp.size(); i++){
if(tmp[i].first==tmp[0].first && tmp[i].first>=2){ // 2번이상 주문되어야한다.
answer.push_back(tmp[i].second);
}
}
}
sort(answer.begin(), answer.end());
return answer;
}
|
cs |
반응형
'Algorithm > 카카오 기출' 카테고리의 다른 글
2021 KAKAO BLIND RECRUITMENT : 합승 택시 요금(c++) / 플로이드 와샬 (0) | 2021.03.09 |
---|---|
2021 KAKAO BLIND RECRUITMENT : 신규 아이디 추천(c++) (0) | 2021.03.08 |
2020 KAKAO BLIND RECRUITMENT - 외벽 점검(c++) (0) | 2021.03.06 |
2020 KAKAO BLIND RECRUITMENT - 괄호 변환(c++) (0) | 2021.03.04 |
2020 KAKAO BLIND RECRUITMENT - 문자열 압축(c++) (0) | 2021.03.04 |
Comments