본문 바로가기

Algorithm/PS

[1일 1알고] 주차 요금 계산

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

카카오에서 출제한 lv2문제치고는 굉장히 간단한 문제입니다.

다만 구현할거리가 적진 않았네요

 

기본적으로 주어진 문자열을 파싱하고 이를 통해서 자료구조에 저장해가며 해결하는 방식입니다.

 

단순 구현문제이기에 사람마다 해결방식이 다를 수 있습니다.

저는 차가 들어간 시간만을 기록하는 map과 결과를 기록하는 map을 사용했습니다.

 

문제의 시간이 빡빡하지는 않을 거라 마지막에 정렬하는게 귀찮기 때문에 ordered_map을 그대로 사용했습니다.

 

파싱은 문자열의 형식이 정해져있기 때문에 char하나하나를 받아 구조체에 넣어줬는데 stringstream을 잘 사용하시는 분이라면 더 편하게 파싱할 수 있었겠네요


using namespace std;

struct parking
{
    int time;
    int number;
    bool isIn;
};

// fee = [기본 시간, 기본 요금, 단위 시간, 단위 요금]
// record = ["00:00 0000 INorOUT"]
vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    vector<parking> parkings;

    map<int, int> resultMap;
    map<int, int> carInMap;
    for (string record : records)
    {
        parking park;
        int temp = record[0] - '0';
        temp = temp * 10 + (record[1] - '0');

        park.time = temp;

        temp = record[3] - '0';
        temp = temp * 10 + (record[4] - '0');
        park.time = park.time * 60 + temp;

        int number = record[6] - '0';
        number = number * 10 + (record[7] - '0');
        number = number * 10 + (record[8] - '0');
        number = number * 10 + (record[9] - '0');
        park.number = number;
        if (record[11] == 'I') park.isIn = true;
        else park.isIn = false;

        parkings.push_back(park);

        resultMap[number] = 0;
        carInMap[number] = -1;
    }

    for (const parking& park : parkings)
    {
        if (park.isIn)
        {
            carInMap[park.number] = park.time;
        }
        else
        {
            resultMap[park.number] += 
                park.time - carInMap[park.number];
            carInMap[park.number] = -1;
        }
    }

    for (auto elem : carInMap)
    {
        if (elem.second != -1)
        {
            resultMap[elem.first] += 23 * 60 + 59 - elem.second;
        }


        int fee = 0;
        if (resultMap[elem.first] > fees[0])
        {
            fee = fees[1] +
                ceil(((double)resultMap[elem.first] - fees[0]) / fees[2])
                * fees[3];
        }
        else
        {
            fee = fees[1];
        }
        answer.push_back(fee);
    }

    return answer;
}