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

2022. 9. 13. 17:31코딩 공부 연습

반응형

카카오 블라인드 문제였던 주차 요금 계산이다. 열심히 풀었는데 문제를 잘못이해해서 처음부터 다시 해야한다. 

그런데 c++에서의 문자열 처리 부분에서 기억해 놓으면 참 좋을 것 같은 게 많아서 갈아엎기전에 좀 기억할 겸 정리해 놓고 가려고 한다ㅋㅋ

 우선,  strtok 이다. 이 strtok 는 char * 형에 대해서만 사용할 수 있기 때문에 이 문제처럼 vector<string> records 로 들어오면 이 string 타입을 같은 크기만큼의 캐릭터배열로 만들고, 옮겨준 다음에 strtok를 하고, 잘라낸 char * 배열은 다시 string 으로 바꿔서 vector <string>에 저장해 주어야 한다. python으로 코테를 보지 않는 한계다! 허허

	char tmp[records[i].length()];      //string reconds의 크기만큼 캐릭터 배열 할당
        strcpy(tmp, records[i].c_str());    //c_str로 스트링을 캐릭터배열로 바꿔야 strtok사용 가능
        char *ptr = strtok(tmp, " ");		//strtok를 사용해 띄어쓰기 기준으로 tmp를 자르기 시작
        vector<string> token;
        while(ptr != NULL)
        {
            token.push_back(string(ptr));
            ptr = strtok(NULL, " ");
        }

틀리게 짠 전체코드는 다음과 같다ㅋㅋ 이거 그 입,출차를 여러번 하면 그 시간 합으로 구해야하는걸 몰랐다. 난 상식적으로 들어갔다 나올때마다 요금을 부과했는데, 그냥 다 더해서 마지막에 계산만 해주면 되는거였다 하하! 쉬운거였는디

#include <string>
#include <vector>
#include <iostream>
#include <cstring>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

int change_to_time(string str)
{
    int si, boon;
    si = 0;
    if (str[0] == '1')
        si = 10;
    else if (str[0] == '2')
        si = 20;
    si += (str[1] - '0');
    boon = 0;
    boon += 10*(str[3] -'0');
    boon += (str[4] - '0');
    return (si*60 + boon);
}
int get_fee(int starttime, int endtime, vector<int>fees)
{
    int total = 0;
    int diff = endtime-starttime;
    if (fees[0] >= diff)
        return fees[1];
    //total+=fees[0];
    diff-=fees[0];  //기본요금빼고,
    int dividend = diff/fees[2];
    total += fees[1];
    total += (dividend*fees[3]);
    return total;
}
vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    vector<pair<int,int>> tmp_ans;
    map<string, string> cars;
    for(int i = 0; i< records.size(); i++)
    {
        //레코드를 다 잘라서, in 인 경우에는 pair 벡터 리스트에 일단 집어넣음.(차량번호- 시간)
        //out일 때 벡터에서 차량번호를 찾아서 나간시간과 대조, 없애버림...
        //마지막에 남아있는거 제외 -> 벡터말고 set으로 하는게 나을듯.
        char tmp[records[i].length()];      //length, size 차이가 있나? 난 사이즈 쓰는디
        strcpy(tmp, records[i].c_str());    //c_str로 스트링을 캐릭터배열로 바꿔야 strtok사용 가능
        char *ptr = strtok(tmp, " ");
        vector<string> token;
        while(ptr != NULL)
        {
            token.push_back(string(ptr));
            ptr = strtok(NULL, " ");
        }
        if(token[2] == "IN")
            cars.insert({token[1], token[0]});
        if (token[2] == "OUT")
        {
            string intime = cars.find(token[1])->second;
            cars.erase(cars.find(token[1]));
            // 이제 스트링으로 들어온 05:34 를 시간으로 바꿔서 in, out 사이 시간을 계산해야함.
            int starttime = change_to_time(intime);
            int endtime = change_to_time(token[0]);
           // cout<<starttime << ' ' << endtime << '\n';
           // 이제 요금을 계산할 수 있고, 차량번호가 작은 수부터 벡터에 담에 리턴해줘야 하기 때문에 차량번호-요금 벡터를 만들어 다 저장한다.
            //cout<< "starttime and endtime : " << starttime << ' ' << endtime << '\n';
            int total = get_fee(starttime, endtime, fees);
            //cout<< "total is " << total<<'\n';
            char tmpnum[token[1].length()]; strcpy(tmpnum, token[1].c_str());
            int carnum = atoi(tmpnum);
            tmp_ans.push_back({carnum, total});
        }
    }
   // cout<<cars.size()<<'\n';
     if (cars.size() != 0)
     {
         int sz = cars.size();
         for (int i = 0 ; i < sz; i++)
         {
             string intime = cars.begin()->second;
             cout<< "left cars intime is " << intime << '\n';
             int starttime = change_to_time(intime);
             int endtime = change_to_time("23:59");
             cout<< "endtime - starttime is " <<starttime << ' ' << endtime << ' ' << endtime - starttime <<'\n';
             int total = get_fee(starttime, endtime, fees);
             char tmpnum[cars.begin()->first.size()];
             strcpy(tmpnum, cars.begin()->first.c_str());
             int carnum = atoi(tmpnum);
             tmp_ans.push_back({carnum, total});
             cars.erase(cars.begin());
         }
     }
    sort(tmp_ans.begin(), tmp_ans.end());
    for(int i = 0; i< tmp_ans.size(); i++)
    {
        cout<<tmp_ans[i].first << ' '<< tmp_ans[i].second << '\n';
    }
    // 24시를 넘어간 차량이 있기 때문에 걔네들도 위에 for문에서 한 일을 해줌.
    return answer;
}

나중에 고치면 새로 올려야지 아