[Programmers] Lv3. [1์ฐจ] ์…”ํ‹€๋ฒ„์Šค | C++

2023. 11. 18. 00:10ใ†Coding Test/Programmers

๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 

๐Ÿ‘จโ€๐Ÿ’ปํ’€์ด ๊ณผ์ •

 

์ œ ๋ฌธ์žฅ ๋…ํ•ด๋ ฅ์— ํ•˜์ž๊ฐ€ ์žˆ๋Š”๊ฑด์ง„ ๋ชฐ๋ผ๋„, ์ฒ˜์Œ์— ๋ฌธ์ œ ์ฝ๊ณ  ๋ฌด์Šจ ์†Œ๋ฆฌ์ง€ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ ์…”ํ‹€ ๋ฒ„์Šค ์šดํ–‰ ํšŸ์ˆ˜์ธ n ๋ฒˆ ๋‚ด์— ์‚ฌ๋ฌด์‹ค์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋Šฆ์€ ์‹œ๊ฐ„์„ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด์—ˆ๋„ค์š”. ๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฌธ์ œ์ด๊ธด ํ•œ๋ฐ, ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ๊ณ„์‚ฐ ๋ถ€๋ถ„์—์„œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ์€ ๊ณ„์‚ฐํ•˜๊ธฐ ์‰ฝ๊ฒŒ, string์„ int๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ๋จผ์ € ํ•ด๋ณด์ฃ .

 

1. String ๐Ÿ‘‰๐Ÿป Int๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑ

 

์ฃผ์–ด์ง€๋Š” ์‹œ๊ฐ„์€ "HH:MM" ํ˜•ํƒœ๋ฅผ ๋„๊ณ  ์žˆ๋‹ค๊ณ  ๋ฌธ์ œ์—์„œ ์•Œ๋ ค์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ž์—ด์—์„œ ์‹œ๊ฐ„(hour) ๋ถ€๋ถ„๊ณผ ๋ถ„(minute) ๋ถ€๋ถ„์„ ์ถ”์ถœํ•ด์•ผ๊ฒ ๋„ค์š”. ๊ทธ ํ›„, Int๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•  ๊ฑด๋ฐ, ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹จ์œ„๋ฅผ ๋ถ„(minute)์œผ๋กœ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

const int UNIT = 60;

int ConvertStringToMinuteInt(const string& time) {
    int hour = stoi(time.substr(0, 2));
    int minute = stoi(time.substr(3, 2));
    return hour * UNIT + minute; 
}

 

2. Int ๐Ÿ‘‰๐Ÿป String์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ž‘์„ฑ

 

๊ฒฐ๊ตญ ์ •๋‹ต์œผ๋กœ ๋ฆฌํ„ดํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์€ string์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌํ•˜๋Š” ์ž‘์—… ๋˜ํ•œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ฃผ์˜ํ•  ์ ์ด ์‹œ๊ฐ„์ด๋“  ๋ถ„์ด๋“  ๋ชจ๋‘ ๋‘ ์ž๋ฆฌ์”ฉ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด, 9์‹œ 5๋ถ„์ด๋ผ๋„ ๋ฆฌํ„ด์€ "09:05"๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

string ConvertMinuteIntToString(const int& time) {
    int hour = time / UNIT;
    int minute = time % UNIT;

    string strHour = to_string(hour);
    if (strHour.length() < 2)
        strHour.insert(0, "0");
    
    string strMinute = to_string(minute);
    if (strMinute.length() < 2)
        strMinute.insert(0, "0");

    string result = strHour + ":" + strMinute;
    return result;
}

 

3. ๋ณธ๊ฒฉ์ ์ธ ๋กœ์ง ๊ตฌ์„ฑํ•˜๊ธฐ

 

์‚ฌ์ „ ์ค€๋น„๋Š” ๋‹ค ํ–ˆ์œผ๋‹ˆ, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋กœ์ง ๊ตฌ์„ฑ์„ ํ•ด๋ณผ ๊ฒ๋‹ˆ๋‹ค. ์šฐ์„ , ์ฃผ์–ด์ง„ timetable์„ int๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ multiset์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•  ๊ฒ๋‹ˆ๋‹ค. 1)์ค‘๋ณต ํ‚ค ๊ฐ’์ด ํ—ˆ์šฉ๋˜๊ณ , 2)์‚ญ์ œ์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์œผ๋ฉฐ, 3)์ •๋ ฌ์ด ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

int N = timetable.size();
multiset<int> intTimes;

for (int i = 0; i < N; i++)
    intTimes.emplace(ConvertStringToMinuteInt(timetable[i]));

 

 

๊ทธ ํ›„, ์…”ํ‹€ ๋ฒ„์Šค๊ฐ€ ์šดํ–‰ ํšŸ์ˆ˜์ธ n ๋ฒˆ ๋™์•ˆ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ, ์ •๋‹ต์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ›„๋ณด ์‹œ๊ฐ„๋Œ€๋“ค์„ ๋ฐฐ์—ด์— ๋‹ด์„ ๊ฒ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฒ„์Šค๊ฐ€ ์ถœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ํƒ‘์Šน๊ฐ๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋ฉฐ ์นด์šดํŒ…ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„์Šค์˜ ์ฒซ ์ถœ๋ฐœ ์‹œ๊ฐ์€ "09:00" ์ž…๋‹ˆ๋‹ค. 
    • ์ œ๊ฑฐํ•œ ํƒ‘์Šน๊ฐ์˜ ์‹œ๊ฐ์„ ๋”ฐ๋กœ ์ €์žฅํ•ด ๋‘ก๋‹ˆ๋‹ค.
    • ์ด ๋•Œ, ๋ฒ„์Šค์— ํƒ„ ํƒ‘์Šน๊ฐ์ด ์ตœ๋Œ€ ์ธ์›(m)์ด ๋œ๋‹ค๋ฉด ์ด ๋กœ์ง์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  2. ํ˜„์žฌ ๋ฒ„์Šค์— ํƒ„ ํƒ‘์Šน๊ฐ์ด ์ตœ๋Œ€ ์ธ์›(m)๋ณด๋‹ค ์ ๋‹ค๋ฉด "ํ˜„์žฌ ๋ฒ„์Šค ์‹œ๊ฐ"์„,
    ์•„๋‹ˆ๋ผ๋ฉด "๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ํƒ„ ํƒ‘์Šน๊ฐ ์‹œ๊ฐ„ - 1"์„ ํ›„๋ณด ์‹œ๊ฐ„๋Œ€๋กœ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ํƒ„ ํƒ‘์Šน๊ฐ๋ณด๋‹ค 1๋ถ„ ๋นจ๋ฆฌ ์™€์•ผ, ๋ฒ„์Šค์— ํƒˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ์‚ฌ๋ฌด์‹ค์— ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ›„๋ณด ์‹œ๊ฐ„๋Œ€๋กœ ์„ ์ •ํ•œ ๊ฐ’์„ ํ›„๋ณด ์‹œ๊ฐ„๋Œ€ ๋ฐฐ์—ด์— ๋‹ด์Šต๋‹ˆ๋‹ค.
  3. ๋ฒ„์Šค ์ถœ๋ฐœ ์‹œ๊ฐ์„ t ๋ถ„ ๋”ํ•ด์„œ ๊ฐฑ์‹ ํ•˜๊ณ , ์œ„ ๋กœ์ง์„ n ๋ฒˆ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  4. ํ›„๋ณด ์‹œ๊ฐ„๋Œ€ ๋ฐฐ์—ด์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ String์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

 


โœ๏ธ์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๊ฒฐ๊ณผ

 

#include <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

const int UNIT = 60;

int ConvertStringToMinuteInt(const string& time) {
    int hour = stoi(time.substr(0, 2));
    int minute = stoi(time.substr(3, 2));
    return hour * UNIT + minute; 
}

string ConvertMinuteIntToString(const int& time) {
    int hour = time / UNIT;
    int minute = time % UNIT;

    string strHour = to_string(hour);
    if (strHour.length() < 2)
        strHour.insert(0, "0");
    
    string strMinute = to_string(minute);
    if (strMinute.length() < 2)
        strMinute.insert(0, "0");

    string result = strHour + ":" + strMinute;
    return result;
}

string solution(int n, int t, int m, vector<string> timetable) {
    int N = timetable.size();
    multiset<int> intTimes;

    for (int i = 0; i < N; i++)
        intTimes.emplace(ConvertStringToMinuteInt(timetable[i]));

    int busTime = 9 * UNIT;
    int runCount = 0;

    vector<int> answers;

    while (runCount < n) {
        int passengerCount = 0;
        int lastPassengerTime = 0;

        while (!intTimes.empty() and *intTimes.begin() <= busTime) {
            passengerCount++;
            lastPassengerTime = *intTimes.begin();
            intTimes.erase(intTimes.begin());

            if (passengerCount == m)
                break;
        }

        int boardingTime = (passengerCount < m) ? busTime : lastPassengerTime - 1;
        answers.emplace_back(boardingTime);

        busTime += t;
        runCount++;
    }

    sort(answers.begin(), answers.end(), greater<int>());
    return ConvertMinuteIntToString(answers[0]);
}

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•