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;
}