ABOUT ME

Today
Yesterday
Total
  • [프로그래머스] Level2 - 주차 요금 계산
    코딩 테스트 2022. 10. 5. 14:20

    1. 문제 설명

    Link : https://school.programmers.co.kr/learn/courses/30/lessons/92341

    2. 나의 풀이

    #include <string>
    #include <vector>
    #include <map>
    #include <sstream>
    #include <cmath>
    
    using namespace std;
    
    struct ParkingData
    {
        int recentTime;
        int acc;
        bool parked;
    
        ParkingData() :
            recentTime(0),
            acc(0),
            parked(false)
            {
            }
    };
    
    vector<int> solution(vector<int> fees, vector<string> records) 
    {
        int baseTime = fees[0];
        int baseFee = fees[1];
        int unitTime = fees[2];
        int unitFee = fees[3];
    
        map<int, ParkingData> mapParkData;
    
        int hour, minute, plateNum;
        string buf;
        stringstream ss;
    
        for (int i = 0; i < records.size(); ++i)
        {
            ss << records[i];
    
            // Time
            getline(ss, buf, ':');
            hour = stoi(buf);
    
            ss >> minute;
    
            // 번호판 숫자
            ss >> plateNum;
    
            // 처음 주차하는 것인지 확인
            auto find = mapParkData.find(plateNum);
    
            if (find == mapParkData.end())
            {
                ParkingData data;
                data.recentTime = hour * 60 + minute;
                data.parked = true;
                mapParkData.insert(make_pair(plateNum, data));
            }
            else
            {
                // 주차된 상태에서 밖으로 나가는 경우
                // 누적 시간 계산하고 out처리
                if (find->second.parked)
                {
                    find->second.acc += (hour * 60 + minute) - find->second.recentTime;
                    find->second.parked = false;
                }
                // 다시 주차하러 들어온 경우
                // 주차하러 들어온 시간 update
                else
                {
                    find->second.recentTime = hour * 60 + minute;
                    find->second.parked = true;
                }
            }
    
            ss.str("");
        }
    
        vector<int> answer;
        auto iter = mapParkData.begin();
        auto iterEnd = mapParkData.end();
    
        for (; iter != iterEnd; ++iter)
        {
            // 아직 주차상태인 경우 11:59 기준으로 정산
            if (iter->second.parked)
            {
                iter->second.acc += (23 * 60 + 59) - iter->second.recentTime;
            }
    
            int fee;
    
            if (iter->second.acc <= baseTime)
            {
                fee = baseFee;
            }
            else
            {
                fee = baseFee + ceil((float)(iter->second.acc - baseTime) / unitTime) * unitFee;
            }
    
            answer.push_back(fee);
        }
    
        return answer;
    }

    map은 key기준 오름차순으로 정렬되므로 vector로 답을 리턴할 때 따로 정렬해줄 필요가 없다.

    주차 정보 구조체를 만들어놓고, key값을 번호판 번호로 하여 map에 넣었다.

    주차장에 들어올 때 들어온 시간 갱신, 나갈 때 주차 시간 누적해주는 방식으로 번호별 누적 시간을 계산하고,

    map을 순회하며 최종 요금을 계산해주는 방식으로 구현했다.

     

    3. 다른 사람들의 풀이

    #include <bits/stdc++.h>
    using namespace std;
    
    int conv(string& t) {
        int h = (t[0] - 48) * 10 + t[1] - 48;
        int m = (t[3] - 48) * 10 + t[4] - 48;
        return h * 60 + m;
    }
    
    vector<int> solution(vector<int> fees, vector<string> records) {
        vector<int> vec[10000];
        for (auto& record : records) {
            stringstream ss(record);
            string a, b, c;
            ss >> a >> b >> c;
            vec[stoi(b)].push_back(conv(a));
        }
    
        vector<int> ans;
        for (int i = 0; i < 10000; ++i) if (!vec[i].empty()) {
            if (vec[i].size() & 1) vec[i].push_back(23 * 60 + 59);
    
            int sum = 0;
            for (int j = 1; j < vec[i].size(); j += 2) sum += vec[i][j] - vec[i][j - 1];
    
            int val = fees[1];
            if (sum > fees[0]) val += (sum - fees[0] + fees[2] - 1) / fees[2] * fees[3];
    
            ans.push_back(val);
        }
    
        return ans;
    }

    언제쯤 이렇게 깔끔하게 짤 수 있을까

    댓글

GameDev.