[프로그래머스] 주차 요금 계산 C++ - 문자열 (2022_카카오)

dada·2022년 3월 7일
0

CodingTest

목록 보기
3/9

Level2문제인 주차 요금 계산을 풀어보기!

문제

https://programmers.co.kr/learn/courses/30/lessons/92341
💁 오늘은 문제가 너무 길어서..링크로 첨부✌🏻

풀이방식

  1. records를 분리해주는게 우선이라고 생각하여 공백을 기준으로 info벡터에 시간, 차번호, IN/OUT순으로 넣어준다.
    👉🏻 unordered_map<string,vector> map을 이용해
    info[2]인 즉, "IN"인 경우에는 map에 넣어준다. (즉, map["0000"] = {05:34} 이런식으로)
    👉🏻 "OUT"인 경우는 map["0000"]에 저장된 가장 위에 값을 꺼내고, 꺼낸값은 IN값이므로 현재 OUT값과 IN값의 시간을 계산해준다. (나는 여기서 splitTime 함수를 만들어서 시간을 계산해주도록 했다.)
    👉🏻 계산된 시간을 새로운 map인 unordered_map<string, int> res에 res[차번호] += 시간 으로 값을 저장해준다.
  2. out인 경우에만 res에 값을 저장해두도록 코드를 작성하여 out정보가 없는 경우가 아직 남아있다. 이경우는 반복문을 나와 23:59시간을 끝시간으로 지정하여 시간을 계산해줬다.
  3. 이제 시간에 따른 총 금액을 계산해야 한다.
    res 반복문을 돌면서 기본시간 보다 작은 경우는 기본 요금을 더해주고,
    기본시간 보다 크면 제공해준 공식을 이용해 계산한다.
    (😂여기서 주의할 점은 올림 처리를 해줘야한다.->이거 못봐서...시간이 더 걸렸다.)
  4. 차번호 오름차순으로 출력하기 때문에, 정렬 후 answer 벡터에 값을 저장한다.

코드

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <math.h>
using namespace std;
//3시간에 5000원 10분 단위로 600원
//fees :기본시간, 기본요금, 단위 시간, 단위 요금

int splitTime(string in, string out) {
    int hour_diff = stoi(out.substr(0,2)) - stoi(in.substr(0,2));
    int min_diff = stoi(out.substr(3,2)) - stoi(in.substr(3,2));
    
    int total_diff = hour_diff * 60 + min_diff;
    return total_diff;
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    vector<pair<string,int>> tmp;
    unordered_map<string,vector<string>> map;
    unordered_map<string, int> res;
    
    for(int i = 0; i< records.size(); i++) {
        stringstream ss(records[i]);
        string tmp;
        vector<string> info;
        while (ss >> tmp) 
            info.push_back(tmp);
        
        if(info[2] == "IN") {
            map[info[1]].push_back(info[0]);
        }
        //out이면 계산을 한다.
        else {
            string out_time = info[0];
            string in_time = map[info[1]].back();
            map[info[1]].pop_back();
            int diff = abs(splitTime(out_time, in_time));
            res[info[1]] += diff;     
        }      
    }
    
    for(auto it : map) {
        if(!map[it.first].empty()) {
            res[it.first] += abs(splitTime("23:59",map[it.first].back()));
        }
    }
    
    for(auto it : res) {
        int price = 0;
        if(it.second <= fees[0]) price = fees[1];
        else {
            price = fees[1] + ceil((double)(it.second - fees[0]) / fees[2]) * fees[3];

        }
        tmp.push_back({it.first, price});
        
    }
    
    sort(tmp.begin(), tmp.end());
    
    for(int i = 0; i < tmp.size(); i++)
        answer.push_back(tmp[i].second);
    return answer;
}

사용한 c++ STL

  • unorderd_map
  • math.h : ceil, abs
  • sstream : stringstream
  • algorithm : sort

🐥후기

주어진대로 풀긴 했는데 풀면서도 코드가 점점 더러워진다는 느낌을 받았다.. 다른 사람 코드를 보니 역시나 복잡한 것 같다ㅠ

profile
기록하기

0개의 댓글