https://softeer.ai/practice/6266
๋ฌธ์ ์ค๋ช
ํ์์ค์ ์ n ์์ฝ๋ ํ์์ ์ m
์ดํ n๊ฐ์ ์ค์ ํ์์ค์ ์ด๋ฆ r์ด ์ฃผ์ด์ง
์ด์ด M๊ฐ์ ์ค์ ๊ฐ ํ์๊ฐ ๋ฐฐ์ ๋ ํ์์ค์ ์ด๋ฆ r๊ณผ ์์ ์๊ฐ s, ๊ทธ๋ฆฌ๊ณ ์ข ๋ฃ ์๊ฐ t๊ฐ ์ฃผ์ด์ง
3 7
grandeur
avante
sonata
sonata 14 16
grandeur 11 12
avante 15 18
sonata 10 11
avante 9 12
grandeur 16 18
avante 12 15
๊ฐ ํ์์ค์ ๋ํ ๊ฐ๋ฅํ(ํ์๊ฐ ์๋) ์๊ฐ๋๋ฅผ ํ์์ค ์ด๋ฆ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ฉด ๋จ
Room avante:
Not available
-----
Room grandeur:
2 available:
09-11
12-16
-----
Room sonata:
3 available:
09-10
11-14
16-18
ํ์ด
์ ์ถ๋ ฅ์ด ์ผ๋จ ๊ต์ฅํ ๋ณต์กํ๊ณ ๊น๊นํ๋ค.
์๊ฐ๋๋ณ ํ์์ค์ ์ํ๋ฅผ status ๋ฒกํฐ๋ก ๊ด๋ฆฌํ๋ค
status[i][j] = i๋ฒ ํ์์ค์ j์๊ฐ์ ๊ฐ๋ฅ ์ฌ๋ถ
์ด ๊ณผ์ ์์ ํ์์ค ์ด๋ฆ๊ณผ ํ์์ค ๋ฒํธ๋ฅผ ๋งค์นญ์ํค๊ธฐ ์ํด ์๋ฃ๊ตฌ์กฐ map์ ์ฌ์ฉํ๋ค
map<ํ์์ค ์ด๋ฆ(ํค), ํ์์ค ๋ฒํธ(๊ฐ)> status
์ด๋ ํ์์ค ์ด๋ฆ ์๋ฌธ ์ค๋ฆ์ฐจ์์ผ๋ก ํด์ผํ๋ ์ถ๋ ฅ ์กฐ๊ฑด์ ์๋์ผ๋ก ํ ์ ์๋ค๋๊ฑด ๋ค
(๋งต ์๋ฃ๊ตฌ์กฐ๋ ํค๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ์ฅํ๋ค)
// ํ์์ค์ ๋ฒํธ ๋ถ์ฌ
map<string, int> room;
string r;
for(int i=0; i<n; i++) {
cin >> r;
room.insert({r, i});
}
์ฝ๋
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int,int> ci;
// 9์๋ถํฐ 18์๊น์ง ์๊ฐ๋ ๊ฐฏ์
const int TIME = 9;
const int START = 9;
const int END = 18;
int main() {
int n, m;
cin >> n >> m;
// ํ์์ค์ ๋ฒํธ ๋ถ์ฌ
map<string, int> room;
string r;
for(int i=0; i<n; i++) {
cin >> r;
room.insert({r, i});
}
// ๊ฐ ํ์์ค ์์ฝ๋ด์ญ ์ถ๊ฐ
vector<vector<ci>> reserve(n, vector<ci>());
int s, t;
for(int i=0; i<m; i++) {
cin >> r >> s >> t;
int room_num = room[r];
reserve[room_num].push_back({s,t});
}
int cnt = 0;
for(auto iter=room.begin(); iter!=room.end(); iter++) {
// ๊ฐ๋ฅํ ์๊ฐ๋ ๊ตฌํ๊ธฐ
int room_num = room[iter->first];
vector<ci> unavailable = reserve[room_num];
sort(unavailable.begin(), unavailable.end());
vector<ci> available;
int cur = START;
for(ci i : unavailable) {
if(i.first != cur) {
available.push_back({cur, i.first});
}
cur = i.second;
}
if(cur != END) {
available.push_back({cur, END});
}
// ์ถ๋ ฅํ๊ธฐ
cout << "Room " << iter->first << ":\n";
if(available.size() > 0) {
cout << available.size() << " available:\n";
for(ci i : available) {
if(i.first<10) cout << "0";
cout << i.first << "-" << i.second << "\n";
}
} else {
cout << "Not available\n";
}
cnt++;
if(cnt != n) {
cout << "-----\n";
}
}
return 0;
}
์ํ์ฐฉ์ค
์ด์ m๊ฐ ์ค์ ๋๋ฉฐ ํ์์ค ์์ฝ์ ํ์ํ๋ค
avante 15 18 ์ด ์ฃผ์ด์ก๋ค๋ฉด
map[avante]๋ฅผ ํตํด avanteํ์์ค์ ๋ฒํธ 0์ ๋ฝ์๋ด๊ณ
status[0][6] ๋ถํฐ status[0][9] ๊น์ง๋ฅผ false ๋ก ์ฑ์ฐ๋ ํ์
15๋ถํฐ 18์ด ์๋ 6๋ถํฐ 9์ธ ์ด์ ๋ ํ์์ค ๊ฐ๋ฅ ์ต์ด ์๊ฐ์ธ 9๋ฅผ ๊ฐ๊ฐ ๋นผ์คฌ์
// ํ์์ค ์ํ ์
๋ฐ์ดํธ
vector<vector<bool>> status(n, vector<bool>(TIME, true));
int s, t;
for(int i=0; i<m; i++) {
cin >> r >> s >> t;
int room_num = room[r];
for(int i=s; i<t; i++) {
status[room_num][i-START] = false;
}
}
์ด์ ๊ฐ๋ฅํ ์๊ฐ๋๋ฅผ ๊ตฌํด์ผํ๋ค.
status ๋งต์ ์ํํ๋ฉด์ ๊ฐ๋ฅํ ์๊ฐ๋๋ฅผ ๊ตฌํ๊ณ ๋ฐ๋ก ์ถ๋ ฅํด์ฃผ์.
์๊ฐ๋๋ณ ๊ฐ๋ฅ ์ฌ๋ถ๊ฐ ๋ฒกํฐ๋ก ์ฃผ์ด์ก์ ๋ ๊ฐ๋ฅํ ์๊ฐ๋๋ ์ด๋ป๊ฒ ๊ตฌํ ๊น?
๊ฐ ํ์์ค์ ํด๋นํ๋ status์ ์๊ฐ๋๋ณ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ฉด์
(1)๊ฐ๋ฅํ๋ค๊ฐ ๋ถ๊ฐ๋ฅํด์ง๋ ์์
(2)๋ถ๊ฐ๋ฅํ๋ค๊ฐ ๊ฐ๋ฅํด์ง๋ ์์
์ด ๋๊ฐ์ง๋ฅผ branch ๋ฒกํฐ์ ์ ์ฅํ๋ค.
// ๊ฐ๋ฅํ ์๊ฐ๋ ๊ตฌํ๊ธฐ
int cnt = 0;
for(auto iter=room.begin(); iter!=room.end(); iter++) {
int room_num = room[iter->first];
vector<int> branch; // ๊ฐ๋ฅ๊ณผ ๋ถ๊ฐ๋ฅ ๊ฒฝ๊ณ ์๊ฐ๋ ๋ฃ๊ธฐ
bool tmp = true;
for(int j=0; j<TIME; j++) {
if(status[room_num][j] == tmp) {
tmp = !tmp;
branch.push_back(j+START);
}
}
status ๋ฒกํฐ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด,
์๊ฐ๋ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
๊ฐ๋ฅ์ฌ๋ถ | o | x | x | o | o | x | o |
์์์์๋ 1 2 4 6 7 ์ด ์ ์ฅ๋ ๊ฑฐ๋ค
๊ทธ๋ผ ์ด๋ฅผ ํด์ํ๋ฉด ๊ฒฐ๊ตญ ๊ฐ๋ฅํ ์๊ฐ๋๊ฐ
1-2, 4-6, 7-๋๊น์ง
์ด๋ ๊ฒ ์ธ๊ฐ์ง๋ผ๋ ๊ฑธ ์ ์ ์๋ค
์ฆ, branch ๋ฒกํฐ์ ์๋ ๊ฐ์ ์ฐจ๋ก๋๋ก ์ถ๋ ฅ๋ง ํด์ฃผ๋ฉด ๋๋ค!
branch์ ํฌ๊ธฐ / 2 ๋ ๊ฐ๋ฅํ ์๊ฐ๋์ ์์ ๊ฐ๊ธฐ ๋๋ฌธ์
Available: branch.size()/2 ๋ก ๊ฐ๋ฅํ๋ค.
์ฐธ๊ณ ๋ก ์ถ๋ ฅ ์กฐ๊ฑด์ ์๋ "-----" ์ด๊ฑฐ๋ ๋งจ ๋ง์ง๋ง ๋ฐฉ ๋ฐ์๋ ์๋ค๋ ์ ์ฃผ์ํ์
(์ด๊ฑธ ์ํด ๋ง์ง๋ง ๋ฐฉ์ธ ๊ฒฝ์ฐ -----๋ฅผ ์ถ๋ ฅ ์ํ๋๋ก cnt ๋ณ์๋ฅผ ๋ฃ์๋ค)
// ์ถ๋ ฅ
cout << "Room " << iter->first <<":\n";
if(branch.size() == 0) {
cout << "Not available\n";
} else {
cout << branch.size()/2 + branch.size()%2 << " available:\n";
for(int j=0; j<branch.size(); j+=2) {
cout << timeString(branch[j]) << "-" << timeString(branch[j+1]) << "\n";
}
}
cnt++;
if(cnt != n) {
cout << "-----\n";
}
์ฐธ๊ณ ๋ก ์ถ๋ ฅํ ๋ ์ซ์ 9๋ 09๋ก ํ์ํด์ผํ๊ณ
๋ง์ฝ ๋ง์ง๋ง ์๊ฐ๊น์ง ์ฌ์ฉ ๊ฐ๋ฅํด์ branch ๊ฐฏ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ
๋ง์ง๋ง ์ค์ ๋๋ฒ์งธ ์(branch[j+1])๊ฐ ์ ๊ทผ์ด ์๋์ด์ 0์ด ๋์จ๋ค.
์ด ์์ธ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด timeString ํจ์๋ฅผ ์์๋ก ๋ง๋ค์ด์ ์๋จ์ ์ ์ํ๋ค
// 9์๋ถํฐ 18์๊น์ง ์๊ฐ๋ ๊ฐฏ์
const int TIME = 9;
const int START = 9;
const int END = 18;
string timeString(int a) {
if(a==0) return to_string(END);
if(a<10) return "0"+ to_string(a);
return to_string(a);
}
์ฝ๋
#include <iostream>
#include <vector>
#include <map>
using namespace std;
// 9์๋ถํฐ 18์๊น์ง ์๊ฐ๋ ๊ฐฏ์
const int TIME = 9;
const int START = 9;
const int END = 18;
string timeString(int a) {
if(a==0) return to_string(END);
if(a<10) return "0"+ to_string(a);
return to_string(a);
}
int main() {
int n, m;
cin >> n >> m;
// ํ์์ค์ ๋ฒํธ ๋ถ์ฌ
map<string, int> room;
string r;
for(int i=0; i<n; i++) {
cin >> r;
room.insert({r, i});
}
// ํ์์ค ์ํ ์
๋ฐ์ดํธ
vector<vector<bool>> status(n, vector<bool>(TIME, true));
int s, t;
for(int i=0; i<m; i++) {
cin >> r >> s >> t;
int room_num = room[r];
for(int i=s; i<t; i++) {
status[room_num][i-START] = false;
}
}
// ๊ฐ๋ฅํ ์๊ฐ๋ ๊ตฌํ๊ธฐ
int cnt = 0;
for(auto iter=room.begin(); iter!=room.end(); iter++) {
int room_num = room[iter->first];
vector<int> branch; // ๊ฐ๋ฅ๊ณผ ๋ถ๊ฐ๋ฅ ๊ฒฝ๊ณ ์๊ฐ๋ ๋ฃ๊ธฐ
bool tmp = true;
for(int j=0; j<TIME; j++) {
if(status[room_num][j] == tmp) {
tmp = !tmp;
branch.push_back(j+START);
}
}
// ์ถ๋ ฅ
cout << "Room " << iter->first <<":\n";
if(branch.size() == 0) {
cout << "Not available\n";
} else {
cout << branch.size()/2 + branch.size()%2 << " available:\n";
for(int j=0; j<branch.size(); j+=2) {
cout << timeString(branch[j]) << "-" << timeString(branch[j+1]) << "\n";
}
}
cnt++;
if(cnt != n) {
cout << "-----\n";
}
}
return 0;
}