๋ฉ๋ด ๋ฆฌ๋ด์ผ
๋์ด๋ : โ โ โโโ
๊ฑธ๋ฆฐ ์๊ฐ : 50๋ถ
๋ฌธ์
๋ฉ๋ด ๋ฆฌ๋ด์ผ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
๋ฌธ์ ์ค๋ช
๋ ์คํ ๋์ ์ด์ํ๋ ์ค์นดํผ
๋ ์ฝ๋ก๋19๋ก ์ธํ ๋ถ๊ฒฝ๊ธฐ๋ฅผ ๊ทน๋ณตํ๊ณ ์ ๋ฉ๋ด๋ฅผ ์๋ก ๊ตฌ์ฑํ๋ ค๊ณ ๊ณ ๋ฏผํ๊ณ ์์ต๋๋ค.
๊ธฐ์กด์๋ ๋จํ์ผ๋ก๋ง ์ ๊ณตํ๋ ๋ฉ๋ด๋ฅผ ์กฐํฉํด์ ์ฝ์ค์๋ฆฌ ํํ๋ก ์ฌ๊ตฌ์ฑํด์ ์๋ก์ด ๋ฉ๋ด๋ฅผ ์ ๊ณตํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ด๋ค ๋จํ๋ฉ๋ด๋ค์ ์กฐํฉํด์ ์ฝ์ค์๋ฆฌ ๋ฉ๋ด๋ก ๊ตฌ์ฑํ๋ฉด ์ข์ ์ง ๊ณ ๋ฏผํ๋ ์ค์นดํผ๋ ์ด์ ์ ๊ฐ ์๋๋ค์ด ์ฃผ๋ฌธํ ๋ ๊ฐ์ฅ ๋ง์ด ํจ๊ป ์ฃผ๋ฌธํ ๋จํ๋ฉ๋ด๋ค์ ์ฝ์ค์๋ฆฌ ๋ฉ๋ด๋ก ๊ตฌ์ฑํ๊ธฐ๋ก ํ์ต๋๋ค.
๋จ, ์ฝ์ค์๋ฆฌ ๋ฉ๋ด๋ ์ต์ 2๊ฐ์ง ์ด์์ ๋จํ๋ฉ๋ด๋ก ๊ตฌ์ฑํ๋ ค๊ณ ํฉ๋๋ค. ๋ํ, ์ต์ 2๋ช
์ด์์ ์๋์ผ๋ก๋ถํฐ ์ฃผ๋ฌธ๋ ๋จํ๋ฉ๋ด ์กฐํฉ์ ๋ํด์๋ง ์ฝ์ค์๋ฆฌ ๋ฉ๋ด ํ๋ณด์ ํฌํจํ๊ธฐ๋ก ํ์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ 6๋ช
์ด ์ฃผ๋ฌธํ ๋จํ๋ฉ๋ด๋ค์ ์กฐํฉ์ด ๋ค์๊ณผ ๊ฐ๋ค๋ฉด,
(๊ฐ ์๋์ ๋จํ๋ฉ๋ด๋ฅผ 2๊ฐ ์ด์ ์ฃผ๋ฌธํด์ผ ํ๋ฉฐ, ๊ฐ ๋จํ๋ฉ๋ด๋ A ~ Z์ ์ํ๋ฒณ ๋๋ฌธ์๋ก ํ๊ธฐํฉ๋๋ค.)
์๋ ๋ฒํธ | ์ฃผ๋ฌธํ ๋จํ๋ฉ๋ด ์กฐํฉ |
---|---|
1๋ฒ ์๋ | A, B, C, F, G |
2๋ฒ ์๋ | A, C |
3๋ฒ ์๋ | C, D, E |
4๋ฒ ์๋ | A, C, D, E |
5๋ฒ ์๋ | B, C, F, G |
6๋ฒ ์๋ | A, C, D, E, H |
๊ฐ์ฅ ๋ง์ด ํจ๊ป ์ฃผ๋ฌธ๋ ๋จํ๋ฉ๋ด ์กฐํฉ์ ๋ฐ๋ผ ์ค์นดํผ๊ฐ ๋ง๋ค๊ฒ ๋ ์ฝ์ค์๋ฆฌ ๋ฉ๋ด ๊ตฌ์ฑ ํ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฝ์ค ์ข ๋ฅ | ๋ฉ๋ด ๊ตฌ์ฑ | ์ค๋ช |
---|---|---|
์๋ฆฌ 2๊ฐ ์ฝ์ค | A, C | 1๋ฒ, 2๋ฒ, 4๋ฒ, 6๋ฒ ์๋์ผ๋ก๋ถํฐ ์ด 4๋ฒ ์ฃผ๋ฌธ๋์ต๋๋ค. |
์๋ฆฌ 3๊ฐ ์ฝ์ค | C, D, E | 3๋ฒ, 4๋ฒ, 6๋ฒ ์๋์ผ๋ก๋ถํฐ ์ด 3๋ฒ ์ฃผ๋ฌธ๋์ต๋๋ค. |
์๋ฆฌ 4๊ฐ ์ฝ์ค | B, C, F, G | 1๋ฒ, 5๋ฒ ์๋์ผ๋ก๋ถํฐ ์ด 2๋ฒ ์ฃผ๋ฌธ๋์ต๋๋ค. |
์๋ฆฌ 4๊ฐ ์ฝ์ค | A, C, D, E | 4๋ฒ, 6๋ฒ ์๋์ผ๋ก๋ถํฐ ์ด 2๋ฒ ์ฃผ๋ฌธ๋์ต๋๋ค. |
[๋ฌธ์ ]
๊ฐ ์๋๋ค์ด ์ฃผ๋ฌธํ ๋จํ๋ฉ๋ด๋ค์ด ๋ฌธ์์ด ํ์์ผ๋ก ๋ด๊ธด ๋ฐฐ์ด orders, ์ค์นดํผ๊ฐ ์ถ๊ฐํ๊ณ ์ถ์ดํ๋
์ฝ์ค์๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋จํ๋ฉ๋ด๋ค์ ๊ฐฏ์๊ฐ ๋ด๊ธด ๋ฐฐ์ด course๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ค์นดํผ๊ฐ ์๋ก ์ถ๊ฐํ๊ฒ ๋ ์ฝ์ค์๋ฆฌ์ ๋ฉ๋ด ๊ตฌ์ฑ์ ๋ฌธ์์ด ํํ๋ก ๋ฐฐ์ด์ ๋ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
[์ ํ์ฌํญ]
- orders ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 2 ์ด์ 20 ์ดํ์ ๋๋ค.
- orders ๋ฐฐ์ด์ ๊ฐ ์์๋ ํฌ๊ธฐ๊ฐ 2 ์ด์ 10 ์ดํ์ธ ๋ฌธ์์ด์
๋๋ค.
- ๊ฐ ๋ฌธ์์ด์ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ๊ฐ ๋ฌธ์์ด์๋ ๊ฐ์ ์ํ๋ฒณ์ด ์ค๋ณตํด์ ๋ค์ด์์ง ์์ต๋๋ค.
- course ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 10 ์ดํ์
๋๋ค.
- course ๋ฐฐ์ด์ ๊ฐ ์์๋ 2 ์ด์ 10 ์ดํ์ธ ์์ฐ์๊ฐ
์ค๋ฆ์ฐจ์
์ผ๋ก ์ ๋ ฌ๋์ด ์์ต๋๋ค. - course ๋ฐฐ์ด์๋ ๊ฐ์ ๊ฐ์ด ์ค๋ณตํด์ ๋ค์ด์์ง ์์ต๋๋ค.
- course ๋ฐฐ์ด์ ๊ฐ ์์๋ 2 ์ด์ 10 ์ดํ์ธ ์์ฐ์๊ฐ
- ์ ๋ต์ ๊ฐ ์ฝ์ค์๋ฆฌ ๋ฉ๋ด์ ๊ตฌ์ฑ์ ๋ฌธ์์ด ํ์์ผ๋ก ๋ฐฐ์ด์ ๋ด์ ์ฌ์ ์์ผ๋ก
์ค๋ฆ์ฐจ์
์ ๋ ฌํด์ return ํด์ฃผ์ธ์.- ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ์ฅ๋ ๋ฌธ์์ด ๋ํ ์ํ๋ฒณ
์ค๋ฆ์ฐจ์
์ผ๋ก ์ ๋ ฌ๋์ด์ผ ํฉ๋๋ค. - ๋ง์ฝ ๊ฐ์ฅ ๋ง์ด ํจ๊ป ์ฃผ๋ฌธ๋ ๋ฉ๋ด ๊ตฌ์ฑ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด, ๋ชจ๋ ๋ฐฐ์ด์ ๋ด์ return ํ๋ฉด ๋ฉ๋๋ค.
- orders์ course ๋งค๊ฐ๋ณ์๋ return ํ๋ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1 ์ด์์ด ๋๋๋ก ์ฃผ์ด์ง๋๋ค.
- ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ์ฅ๋ ๋ฌธ์์ด ๋ํ ์ํ๋ฒณ
์ฝ๋
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
// 7:10 ์์
// orders <= 20, course <= 10, orders ์์ ๊ธธ์ด <= 10 (์๊ฐ๋ณต์ก๋ ์ถฉ๋ถ)
// 2๋ฒ ์ด์ ๊ฒน์น๋ ์ฝ์ค๋ฉ๋ด, course์ ์๋ ๊ธธ์ด
// orders๋ฅผ ๋ณด๋ฉด์ ๊ฒน์น๋ ์ฝ์ค ๋ฉ๋ด ์ฐพ๊ธฐ (course์ ๋ํด์๋ง)
// => ์ต๋ 20๊ฐ ๋๋ฉด์ include๋ก ๋ค์ด์๋์ง ํ์ธ => ์ต๋ 10๊ฐ์ course์ ๋ํด ํ์ธ => ์ต๋ 252(10C5)*20*10 < 10^6
// ์ต๋๋ก ๋จน์ ๋ฉ๋ด๊ฐ ๋ค์ด๊ฐ์ผํ๋ฏ๋ก ์ ์ฒด ๋ค ๋ฐ์ ธ์ผํจ
// result์ ๋ฃ๊ธฐ (์์๋๋ก ๋ฃ์ผ๋๊น ์๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ)
// ๋ช ๊ฐ์ ๋ฉ๋ด ๊ตฌ์ฑ์ ์ต๋ ๋ช๋ฒ ์ฃผ๋ฌธ๋์๊ณ ๋ฉ๋ด๊ตฌ์ฑ์ด ๋ฌด์์ธ์ง ์ ์ฅํด์ผํจ
// ๊ฐฏ์ => ์ต๋, ๋ฉ๋ด๊ตฌ์ฑ ์ฌ๋ฌ๊ฐ
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
map<int, int> maxNum; // ๋ฉ๋ด ๊ฐฏ์, ์ต๋๊ฐ
map<int, vector<string>> result; // ๋ฉ๋ด ๊ฐฏ์, string๋ค
for(int i=0; i<orders.size(); i++){
// includes ์ฌ์ฉ์ ์ํด sortํด๋๊ธฐ
sort(orders[i].begin(), orders[i].end());
}
for(int i=0; i<course.size(); i++){
maxNum[course[i]] = 1;
vector<string> tmp;
result[course[i]] = tmp;
}
while(orders.size()){ // orders ๋๋ฉด์
string target = orders[0]; orders.erase(orders.begin());
int t_size = target.size();
vector<int> tmp(t_size, 0); // ์กฐํฉ์ ๋ง๋ค๊ธฐ ์ํ tmp vector
for(int i=0; i<course.size(); i++){
int size = course[i]; // ๋ช ๊ฐ์ ์กฐํฉ์ ์ฐพ์ ๊ฑด์ง ๊ฒฐ์
if(t_size<size) // ํ์ฌ order์ ํฌ๊ธฐ๋ณด๋ค ํ์๋กํ๋ ์กฐํฉ ๊ฐฏ์๊ฐ ๋ ํฌ๋ฉด ๊ฑด๋๋ฐ๊ธฐ
continue;
// ๋ค๋ถํฐ size๊ฐ๋งํผ 1 ์ฑ์ฐ๊ธฐ
// next_permutation ์ ์ฉ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๊ตฌ์ฑ๋์ด์์ด์ผ ํจ
for(int j=t_size-1; j>=t_size-size; j--){
tmp[j] = 1;
}
do{
string t_string = ""; // ํฌํจ๋์ด์๋์ง ๊ฒ์ฌํ string
for(int j=0; j<tmp.size(); j++){
if(tmp[j]==1)
t_string += target[j];
}
int num = 1; // ๊ฒน์น๋ ํ์ ์ธก์
for(int j=0; j<orders.size(); j++){ // ํด๋น target string์ ํฌํจํ๊ณ ์๋ ๋ฌธ์์ด์ด orders์ ์๋์ง ํ์ธ
if(includes(orders[j].begin(), orders[j].end(), t_string.begin(), t_string.end())){
// ํฌํจํ๊ณ ์์ผ๋ฉด num ์ฆ๊ฐ
num += 1;
}
}
if(num == 1) // ๊ฒน์น๋๊ฒ ์์ผ๋ฉด ๊ทธ๋ฅ ๋์ด๊ฐ๊ธฐ
continue;
if(maxNum[size]<num){
// max๋ณด๋ค ํฌ๋ฉด vector ์ด๊ธฐํ ๋ฐ ์ถ๊ฐ
result[size].clear();
maxNum[size] = num;
result[size].push_back(t_string);
}else if(maxNum[size]==num){
// max์ ๊ฐ์ผ๋ฉด string ์ถ๊ฐ
result[size].push_back(t_string);
}
}while(next_permutation(tmp.begin(), tmp.end())); // ์กฐํฉ ์ฌ์ฉ
}
}
// answer ์ถ์ถ
for(int i=0; i<result.size(); i++){
for(int j=0; j<result[i].size(); j++){
answer.push_back(result[i][j]);
}
}
// ์ ๋ ฌ
sort(answer.begin(), answer.end());
return answer;
}
// 8:20 ๋ => 1์๊ฐ
ํ์ด
// 7:10 ์์
// orders <= 20, course <= 10, orders ์์ ๊ธธ์ด <= 10 (์๊ฐ๋ณต์ก๋ ์ถฉ๋ถ)
// 2๋ฒ ์ด์ ๊ฒน์น๋ ์ฝ์ค๋ฉ๋ด, course์ ์๋ ๊ธธ์ด
// orders๋ฅผ ๋ณด๋ฉด์ ๊ฒน์น๋ ์ฝ์ค ๋ฉ๋ด ์ฐพ๊ธฐ (course์ ๋ํด์๋ง)
// => ์ต๋ 20๊ฐ ๋๋ฉด์ include๋ก ๋ค์ด์๋์ง ํ์ธ => ์ต๋ 10๊ฐ์ course์ ๋ํด ํ์ธ => ์ต๋ 252(10C5)*20*10 < 10^4
// ์ต๋๋ก ๋จน์ ๋ฉ๋ด๊ฐ ๋ค์ด๊ฐ์ผํ๋ฏ๋ก ์ ์ฒด ๋ค ๋ฐ์ ธ์ผํจ
// result์ ๋ฃ๊ธฐ (์์๋๋ก ๋ฃ์ผ๋๊น ์๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ)
// ๋ช ๊ฐ์ ๋ฉ๋ด ๊ตฌ์ฑ์ ์ต๋ ๋ช๋ฒ ์ฃผ๋ฌธ๋์๊ณ ๋ฉ๋ด๊ตฌ์ฑ์ด ๋ฌด์์ธ์ง ์ ์ฅํด์ผํจ
// ๊ฐฏ์ => ์ต๋, ๋ฉ๋ด๊ตฌ์ฑ ์ฌ๋ฌ๊ฐ
์ฐ์ ์ฃผ์ด์ง ์ ๋ ฅ๊ฐ์ ๋ฒ์๋ฅผ ๋ณด์. ๋ค 10 ์ธ์ ๋ฆฌ์์ผ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ ๊ทธ๋ ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ ๋ฏํ๋ค. ๋ฌธ์ ๋ฅผ ํด์ํ๊ณ ์ด๋ป๊ฒ ํ์ง ์๊ฐํด๋ณด์.
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ๋ฌธ์ ์์๋ course์ ๋ค์ด์๋ ๊ฐฏ์๋งํผ์ ์ฝ์ค๋ฉ๋ด ์ค ๊ฐ์ฅ ๋ง์ด ๊ฒน์น๋ ์ฝ์ค๋ฅผ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ค. ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์๊ฐํ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- course์์ ์ ์ํ ๊ฐฏ์(n)์ ์ฝ์ค๋ฅผ ๋ง๋ค์ด์ผํ๋ค.
- orders๋ฅผ ํ๋์ฉ ๋ณด๋ฉด์ n๊ฐ์ ์์์ผ๋ก ์ด๋ฃจ์ด์ง ์กฐํฉ(๋ฉ๋ด ์กฐํฉ)์ ์ถ์ถํ๋ค.
- next_permutation ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ด ์กฐํฉ์ ์ถ์ถํ์.
- ์ถ์ถํ ๋ฉ๋ด ์กฐํฉ์ด ๋ค๋ฅธ order์๋ ์๋์ง, ๋ช ๋ฒ ๊ฒน์น๋ ์ง ์กฐ์ฌํ๋ค.
- include๋ก ์กฐ์ฌํ์.
- ๊ฒน์น๋ ํ์๊ฐ ๊ธฐ์กด ์กฐํฉ๋ณด๋ค ๋ง๋ค๋ฉด ๊ฐฑ์ ํ๋ค.
- ์ ์ฅํด์ผํ ๊ฒ์ (๋ช ๊ฐ์ ์์์ ์กฐํฉํ ์ง(courseNum), ๊ฐ์ฅ ๋ง์ด ๊ฒน์น๋ ์ซ์(max), ์ฝ์ค๋ฉ๋ด๋ค(
vector<string>
)) ์ด๋ค. - ์ด๋ฅผ ๋์์ ๊ตฌ์ฑํ๊ธฐ๋ ํ๋ค ๊ฒ ๊ฐ์ผ๋ฏ๋ก ๋๊ฐ์ง ์๋ฃ๊ตฌ์กฐ๋ก ๋๋์.
- (courseNum, max)์ (courseNum,
vector<string>
)์ ๊ฐ๊ฐ map์ผ๋ก ๋ง๋ค๋ฉด courseNum์ผ๋ก ์ ๊ทผํ๊ธฐ ํธํ ๋ฏ ํ๋ค.
- ์ ์ฅํด์ผํ ๊ฒ์ (๋ช ๊ฐ์ ์์์ ์กฐํฉํ ์ง(courseNum), ๊ฐ์ฅ ๋ง์ด ๊ฒน์น๋ ์ซ์(max), ์ฝ์ค๋ฉ๋ด๋ค(
- orders๋ฅผ ํ๋์ฉ ๋ณด๋ฉด์ n๊ฐ์ ์์์ผ๋ก ์ด๋ฃจ์ด์ง ์กฐํฉ(๋ฉ๋ด ์กฐํฉ)์ ์ถ์ถํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด course๋ฅผ ๋๋ ๋ฐ๋ณต๋ฌธ(10) ์์ orders๋ฅผ ๋๋ ๋ฐ๋ณต๋ฌธ(20) ์์ n๊ฐ์ ์กฐํฉ์ ์ฐพ๋ ๋ฐ๋ณต๋ฌธ(์ต๋ 45) ์์ ๊ฒน์น๋ ์ฝ์ค๊ฐ ์๋์ง ์กฐ์ฌํ๋ ๋ฐ๋ณต๋ฌธ(20) ์ด ์์ผ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ 10^5๋ฅผ ๋์ง ์๋๋ค.
์ฑ์ ๊ฒฐ๊ณผ
์ฃผ์ํ ๊ฒ
- algorithm ์ ์๋ includes ํจ์์ ์ฌ์ฉ๋ฒ์ ์ตํ๋์.
includes(begin, end, begin2, end2)
- begin, end๊ฐ begin2, end2๋ฅผ ํฌํจํ๊ณ ์๋์ง ๊ฒ์ฌ
- boolean์ผ๋ก ๋ฐํ
- next_permutation ์ฌ์ฉ๋ฒ์ ์ตํ๋์.
- next_permutation(begin, end)
- boolean์ผ๋ก ๋ฐํ
Comment