[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
λ°˜μ‘ν˜•