프로그래머스 문제 - 주차 요금 계산

JUNWOO KIM·2024년 2월 26일
0

알고리즘 풀이

목록 보기
84/105

프로그래머스 주차 요금 계산 문제 풀이를 진행하였습니다.

문제 해석

문제를 읽으면 아래와 같은 해석이 가능합니다.

주차장의 요금표가 주어지고 차량들의 입차, 출차 시간이 주어집니다.
차량별로 주차 요금을 계산하려고 하며 마지막에 출차 시간이 존재하지 않는다면 23:59분에 출차한 것으로 간주합니다.
모든 자동차들의 주차 요금을 차량 번호가 작은 순서대로 출력해야 합니다.

문제 풀이

요금표는 기본시간, 기본요금, 단위시간, 단위요금 순으로 값이 들어옵니다.
이후 차량들이 하루 동안 주차장을 사용한 누적 시간을 구해줍니다.
한 차량이 여러 번 주차를 할 수 있고 차량마다 각각 누적시간을 저장해주어야 하므로 unordered_map컨테이너를 사용하여 저장해줍니다.

모든 차량과 누적시간을 구한 후 누적주차시간이 기본 시간보다 적을 경우 기본요금만, 누적주차시간이 기본 시간보다 클 경우 기본요금 + (누적주차시간-기본시간) / 단위시간 * 단위요금으로 계산해주면 됩니다. 만약 초과한 시간이 단위시간으로 나누어지지 않는다면 올림하여 계산해줍니다.
이후 계산된 값들을 차량번호가 적은 순으로 나열해주면 됩니다.

전체 코드

#include <bits/stdc++.h>
#include <string>
#include <vector>

using namespace std;

bool compare(vector<int> a, vector<int> b){
    return a[0] < b[0];
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    vector<vector<int>> result;
    unordered_map<int, vector<int>> cars;
    unordered_map<int, vector<int>>::iterator iter;
    
    for(int i = 0; i < records.size(); i++) //차량들의 입차, 출차 시간 정렬
    {
        int carNumber = stoi(records[i].substr(6, 4));
        int minute = stoi(records[i].substr(0, 2)) * 60 + stoi(records[i].substr(3, 2));
        iter = cars.find(carNumber);
        if(iter == cars.end()){
            vector<int> v;
            v.push_back(minute);
            cars.emplace(make_pair(carNumber, v));
        }else{
            iter->second.push_back(minute);
        }
    }
    
    for(auto it : cars) //입차, 출차 시간을 기준으로 누적 시간 계산 및 주차요금 계산
    {
        int carNumber = it.first;
        vector<int> vec = it.second;
        
        //출차가 한가지 없다면 23:59분 추가
        if(vec.size() % 2 == 1)
            vec.push_back(23 * 60 + 59);
        
        int time = 0;
        for(int i = 0; i < vec.size(); i += 2)
        {
            time += vec[i+1] - vec[i];
        }
        int price = 0;
        if(time <= fees[0])
            price += fees[1];
        else{
            time -= fees[0];
            price += fees[1];
            if(time % fees[2] != 0)
            {
                price += (time / fees[2] + 1) * fees[3];
            }else{
                price += (time / fees[2]) * fees[3];
            }
        }
        vector<int> v;
        v.push_back(carNumber);
        v.push_back(price);
        result.push_back(v);
    }
    //차량번호가 낮은 순으로 정렬
    sort(result.begin(), result.end(), compare);
    for(vector<int> n : result)
    {
        answer.push_back(n[1]);
    }
    
    return answer;
}

출저

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

profile
게임 프로그래머 준비생

0개의 댓글