[c++/프로그래머스] 주차 요금 계산

조히·2023년 2월 24일
0

PS

목록 보기
32/82

문제 링크

주차 요금 계산

풀이

stringmap 문제.. 알고리즘 자체는 어렵지 않은데 c++이라 헤맸다.. 파이썬 마렵네

  1. stringstream으로 공백 단위로 끊고 차량 번호가 key, 입출차 기록이 value가 되는 map에 넣는다.
  2. map을 돌리면서 입출차 기록이 홀수면 출차 기록이 없다는 뜻이므로 23:59를 추가해주고 주차 시간을 분으로 바꿔주는 timeGap 함수로 주차 시간을 계산한다.
    2-1. timeGap 함수는 : 단위로 끊어주기 위해 stringstreamgetline을 이용하여 hourminute를 분리해주고 분으로 바꾼후 timeToMinute에 넣어준다.
    2-2. timeToMinute를 두 개 단위로 끊어 누적 주차 시간을 리턴한다.
  3. 주차 시간에 따라 요금을 계산해주는 calculate 함수를 호출한다.
    3-1. 문제대로 계산해주면 되는데, 단위시간에 따라 나누어줄 때 ceil(올림)을 사용해줘야 된다.
  4. map은 자동 오름차 순 정렬이니 그대로 answer에 넣어준다.

코드

#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>

using namespace std;

int calculate(vector<int> fees, int gap)
{
    if(gap<=fees[0]) return fees[1];
    float tmp = (gap-fees[0])/(float)fees[2];
    return fees[1]+ceil(tmp)*fees[3];
}

int timeGap(vector<string> time)
{
    vector<int> timeToMinute;
    for(int i=0;i<time.size();i++)
    {
        string hour="";
        string minute="";
        stringstream stream(time[i]);
        getline(stream, hour, ':');
        getline(stream, minute, ':');
        timeToMinute.push_back(stoi(hour)*60+stoi(minute));
    }
    
    int total = 0;
    for(int i=0;i<timeToMinute.size();i+=2)
    {
        total += timeToMinute[i+1]-timeToMinute[i];
    }
    return total;
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    
    stringstream stream;
    map<string,vector<string>> m;
    for(int i=0;i<records.size();i++)
    {
        string car;
        string time;
        stream.str(records[i]);
        stream>>time>>car;
        m[car].push_back(time);
    }
    
    for(auto u:m)
    {
        if(u.second.size()%2==1) u.second.push_back("23:59");
        int gap = timeGap(u.second);
        answer.push_back(calculate(fees, gap));
    }
    
    return answer;
}
profile
Juhee Kim | Game Client Developer

0개의 댓글