Algorithm/프로그래머스

[프로그래머스][C++] 주차 요금 계산 (245)

샤아이인 2022. 9. 21.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

생각의 흐름

우선 2개의 Map을 사용하게 된다.

unordered_map과 map을 사용하게 되는데, map같은 경우 차량 번호의 오름차순으로 결과를 출력해야하기 때문에 사용하였다.

그 외에 주차 시작시간을 저장하는 경우 정렬을 할 필요가 없으니 unordered_map을 사용할 것 이다.

 

우선 다음과 같은 입력을 받는다고 해보자.

"05:34 5961 IN", 
"06:00 0000 IN", 
"06:34 0000 OUT", 
"07:59 5961 OUT", 
"07:59 0148 IN", 
"18:59 0000 IN", 
"19:09 0148 OUT", 
"22:59 5961 IN", 
"23:00 5961 OUT"

공백을 기준으로 나눠서, 각각을 time, num, inout 이라는 변수에 담았다.

 

이후 차량이 주차된 시작 시간을 unordered_map을 통해 저장한다.

start_time_vec["5961"] = "05:34"

 

그다음 "06:00 0000 IN" 이 입력되면, 다음과 같이

start_time_vec["0000"] = "06:00" 이 저장된다.

 

이번에는 "06:34 0000 OUT" 이 입력되는데 출차 하기 때문에 주차시간을 계산하여 저장해야 한다.

이때 다음 calculateDiffTime 메서드를 이용한다.

int calculateDiffTime(string start, string end) {
    int start_minute = to_minute(start);
    int end_minute = to_minute(end);

    return end_minute - start_minute;
}

이렇게 계산된 요금을 cost_time_vec에 저장시킨다.

cost_time_vec["0000"] += calculateDiffTime(start_time, end_time);

 

이런식으로 출차할때 시간을 전부 합쳐 논 후,

마지막에 총 주차시간을 기준으로 전부 가격을 계산하여 반환시켜주면 된다.

 

나의 코드

#include <bits/stdc++.h>

using namespace std;

unordered_map<string, string> start_time_vec;
map<string, int> cost_time_vec;
vector<int> vec;

int to_minute(string num) {
    int h = stoi(num.substr(0, 2));
    int m = stoi(num.substr(3, 2));

    return h * 60 + m;
}

int calculateDiffTime(string start, string end) {
    int start_minute = to_minute(start);
    int end_minute = to_minute(end);

    return end_minute - start_minute;
}

int calculateFee(int time) {
    if (time <= vec[0]) {
        return vec[1];
    } else {
        int overTime = time - vec[0];
        int overCost = overTime % vec[2] == 0 ? (overTime / vec[2]) * vec[3] : ((overTime / vec[2]) + 1) * vec[3];
        return vec[1] + overCost;
    }
}


vector<int> solution(vector<int> fees, vector<string> records) {
    vec = fees;
    vector<int> answer;

    for (auto e: records) {
        stringstream ss(e);

        string time, num, inout;
        ss >> time >> num >> inout;

        if (inout == "IN") {
            start_time_vec[num] = time;
        } else {
            string &startTime = start_time_vec[num];
            cost_time_vec[num] += calculateDiffTime(startTime, time);
            start_time_vec.erase(num);
        }
    }

    for(auto e : start_time_vec) {
        cost_time_vec[e.first] += calculateDiffTime(start_time_vec[e.first], "23:59");
    }

    for (auto e: cost_time_vec) {
        int &costTime = cost_time_vec[e.first];
        int fee = calculateFee(costTime);
        answer.push_back(fee);
    }

    return answer;
}

댓글