슈뢰딩거의 고등어

[2022 Kakao blind recruitment] 주차 요금 계산 본문

알고리즘

[2022 Kakao blind recruitment] 주차 요금 계산

슈뢰딩거의 고등어 2022. 3. 23. 14:28

 

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

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

처음 이 문제를 풀 때, 같은 차량이 하루에 여러번 들어갔다 나갔다 할 수 있다는 것을 고려하지 않았었다.

여러번 왔다갔다 할 수 있고, 차량별로 총 이용시간을 먼저 구한 후 계산을 하면 된다.

[풀이방법]

1. 번호별로 들어온 시간과 나간시간의 정보를 저장한다.

문자열의 분리는 istringstream 을 사용하고 시간의 시, 분 분류는 substr(idx, size)을 사용했다.

시간은 분으로 파싱해 저장한다.

1234 : [12, 612, 632, 1232] // 1234 번의 차량이 0:12분에 들어와 1:12에 나감.  1:32에 들어와 2:32 에 나감

...

보다시피 홀수 위치는 들어온 위치, 짝수 위치는 나간 위치이다. 나가지 않는 차량의 경우 오늘 23:59 에 나간다고 가정을 하면 됨으로, 23:59을 분으로 파싱한 1439가 디폴트로 들어온 시간을 업데이트할때 넣어준다.

나올때는 1439 를 나온 시간으로 업데이트 해주고 하면 된다.

 if(s[2] == "IN"){
    vector <int> v = {min, 1439};
    if(m.find(s[1]) == m.end()) { // 처음 들어오는 차량의 경우
        m.insert(make_pair(s[1], v));
    }
    else {
        m[s[1]].push_back(min);
        m[s[1]].push_back(1439); // 디폴트로 나간시간을 23:59 분이라 가정하고 넣어줌
    }
}
else if(s[2] == "OUT") {
    int idx = m[s[1]].size();
    m[s[1]][idx-1] = min; // 나온 정보가 있다면 1439로 정의되어있던 마지막 부분을 나간시간으로 업데이트해준다.
}

2. 번호별로 입력된 시간의 정보를 기반으로 총 이용시간을 구해서 times에 저장한다.

1234 : [12, 612, 632, 1232]

의 경우, 두개씩 in / out 이 짝지어있으므로

612 - 12 = 600

1232 - 632 = 600

600 + 600 = 1200

을 해서 1234 차량의 경우 총 1200 분을 이용했다는 것을 알 수 있다.

(대충, 예시가 틀린거 같긴한데,,, 얼추 이런 로직이다 정도만 알면 좋을 것 같다)

 

3. times 에 각 차량의 이용시간을 기반으로 계산을 한다.

이용시간 기반으로 비용을 계산한다.

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

using namespace std;

map <string, vector<int>> m;
map <string, int> times;

void add_times (string car, int cost) {
    if(times.find(car) == times.end())
        times.insert(make_pair(car, cost));
    else
        times[car]+= cost;
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    
    for(auto record : records) {
        string s[3];
        istringstream stt(record);
        stt >> s[0] >> s[1] >> s[2];
       
        int hour = stoi(s[0].substr(0, 2));
        int min = stoi(s[0].substr(3, 2));
        
        min += (hour * 60);
        
        if(s[2] == "IN"){
            vector <int> v = {min, 1439};
            if(m.find(s[1]) == m.end()) {
                m.insert(make_pair(s[1], v));
            }
            else {
                m[s[1]].push_back(min);
                m[s[1]].push_back(1439);
            }
        }
        else if(s[2] == "OUT") {
            int idx = m[s[1]].size();
            m[s[1]][idx-1] = min;
        }
    }
    
    for(auto car : m) {
        for(int i=0; i<car.second.size(); i+=2) {
            int usage = car.second[i+1] - car.second [i];
            add_times(car.first, usage);
        }
    }
    
    for(auto time : times) {
        int cost = fees[1];
        int usage = time.second;

        if (usage <= fees[0]) {
            answer.push_back(fees[1]);
            continue;
        }
        
        int tmp = (usage - fees[0]) / fees[2];
        if((usage - fees[0]) % fees[2] != 0)
            tmp+=1;
       
        tmp *= fees[3];
        cost += tmp;  
        answer.push_back(cost);
    }

    return answer;
}
Comments