๐Ÿ“ฆ Chango/๐Ÿš™ Softeer

[Softeer][๋ฐ๋ธŒํฌ๋ฃจ 2์ผ์ฐจ] ์†Œํ”„ํ‹ฐ์–ด Lv.2 ํšŒ์˜์‹ค ์˜ˆ์•ฝ (21๋…„ ์žฌ์ง์ž ๋Œ€ํšŒ ์˜ˆ์„ )

์„ ๋‹ฌ 2024. 1. 26. 05:13
๋ฐ˜์‘ํ˜•

https://softeer.ai/practice/6266

 

Softeer - ํ˜„๋Œ€์ž๋™์ฐจ๊ทธ๋ฃน SW์ธ์žฌํ™•๋ณดํ”Œ๋žซํผ

 

softeer.ai

 

๋ฌธ์ œ ์„ค๋ช…

ํšŒ์˜์‹ค์˜ ์ˆ˜ 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;
}

 

๋ฐ˜์‘ํ˜•