슈뢰딩거의 고등어
[2022 Kakao blind recruitment] 주차 요금 계산 본문
https://programmers.co.kr/learn/courses/30/lessons/92341
처음 이 문제를 풀 때, 같은 차량이 하루에 여러번 들어갔다 나갔다 할 수 있다는 것을 고려하지 않았었다.
여러번 왔다갔다 할 수 있고, 차량별로 총 이용시간을 먼저 구한 후 계산을 하면 된다.
[풀이방법]
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;
}
'알고리즘' 카테고리의 다른 글
[2022 Kakao blind recruitment] k진수에서 소수개수 구하기 (0) | 2022.03.30 |
---|---|
[2021 Kakao blind recruitment] 메뉴 리뉴얼 (0) | 2022.03.23 |
[2022 Kakao blind recruitment] 신고 결과 받기 (0) | 2022.03.23 |
[2022 Kakao blind recruitment] 양궁대회 (0) | 2022.03.22 |
[2021 Kakao blind recruitment] 순위검색 (0) | 2022.03.22 |