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

jihunnit·2022년 9월 19일
0

코테

목록 보기
18/20

주차 요금 계산

뭔가 문자열이지만 문자열이 아닌 것 같은 문제를 많이 만나다가
다시 한번 강력한 친구를 만났다.

사실 이 문제도 문자열을 다룬다고 할 만한 문제는 아닌가..
싶기도 하다.

C++ 기준으로 str.find()str.substr()을 이용한 문자열 나누기, 문자열과 정수형 사이의 형 변환, 자료구조를 이용한 데이터 저장방식 등등 다양하게 고려할 요소들이 있는 좋은 구현 문제였다.

시간복잡도를 요구하는 문제에서는 웬만해서는 못쓰지만, 이런 구현 자체가 더 중요한 문제에서는 map을 즐겨 쓰는 편이다.
key-value 를 통해 쉽게 값을 저장하고 꺼내올 수 있다.
그리고는 값을 잘 꺼내와서 잘 계산해주면 된다.

이렇게 보면 엄청 쉽지만 막상 IDE없이 한 땀 한 땀 코드를 치다보면 정말 오래걸린다. 오류도 많이 나오고 오타도 많고, 함수 원형은 잘 기억도 안나고..어휴

정답 코드는 다음과 같다.

#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
map<int,string> in;
map<int,bool> checker;
map<int,int> times;
vector<int> nums;
vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    for(int i=0;i<records.size();i++){
        string temp = records[i];
        vector<string> v;
        int left=0;
        while(temp.find(" ",left)!=string::npos){
            int right = temp.find(" ",left);
            string s = temp.substr(left,right-left);
            v.push_back(s);
            left=right+1;
        }
        v.push_back(temp.substr(left));
        int num = stoi(v[1]);
        nums.push_back(num);
        if(v[2]=="IN") {
            in[num]=v[0];
            checker[num]=true;
        }
        else {
            int inHour = stoi(in[num].substr(0,2));
            int inMin = stoi(in[num].substr(3));
            int outHour = stoi(v[0].substr(0,2));
            int outMin = stoi(v[0].substr(3));
            if(outMin<inMin){
                outHour--;
                outMin+=60;
            }
            int res = (outHour-inHour)*60+outMin-inMin;
            times[num]+=res;
            checker[num]=false;
        }
    }
    sort(nums.begin(),nums.end());
    nums.erase(unique(nums.begin(),nums.end()),nums.end());
    for(int i=0;i<nums.size();i++){
        if(checker[nums[i]]){
            string start = in[nums[i]];
            int inHour = stoi(start.substr(0,2));
            int inMin = stoi(start.substr(3));
            int outHour = 23;
            int outMin = 59;
            int res = (outHour-inHour)*60+outMin-inMin;
            times[nums[i]]+=res;
        }
    }
    for(int i=0;i<nums.size();i++){
        int sumTime = times[nums[i]];
        if(sumTime<=fees[0]){
            answer.push_back(fees[1]);
        }else{
            int exTime = sumTime-fees[0];
            if(exTime%fees[2]==0){
                answer.push_back(fees[1]+(exTime/fees[2])*fees[3]);
            }else{
                answer.push_back(fees[1]+((exTime/fees[2])+1)*fees[3]);
            }
        }
    }
    
    return answer;
}
profile
인간은 노력하는 한 방황한다

0개의 댓글