문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제]
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어질 때 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 하는 solution 함수 작성하라.
[문제 풀이]
이 문제는 단순 구현 문제였다. 하지만 조건사항이 많아서 일일이 구현하는 것이 쉽지 않았다.
1. 먼저 records 속 문자열에서 시간과 차 번호, 입출차 항목을 따로 나누어주고 map을 이용하여 차 번호에 맞게 시간을 저장해 주었다. 이때, 구조체를 사용하여 입차 시간과 출차 시간 모두를 저장할 수 있게 해 준다.
2. 차 번호에 해당하는 모든 (출차 - 입차) 시간을 계산하여 요금을 부여해 준다.
추가로 차량 번호가 작은 자동차부터 요금을 return 해야 하기 때문에 자료구조 set에 차 번호를 저장하여 정렬될 수 있게 해줘야 한다.
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
using namespace std;
const string MAX_TO = "23:59";
typedef struct {
string from;
string to;
} Time;
int getDiffMinute(string from, string to) { // 주차 시간을 분 단위로 계산해주는 함수
int toHour = stoi(to.substr(0, 2));
int toMinute = stoi(to.substr(3, 2));
int fromHour = stoi(from.substr(0, 2));
int fromMinute = stoi(from.substr(3, 2));
return (toHour - fromHour) * 60 + (toMinute - fromMinute);
}
vector<int> solution(vector<int> fees, vector<string> records) {
map<string, vector<Time>> carRecords;
set<string> carNumbers;
for(string record : records) {
string temp;
vector<string> v;
for(char c : record) { // 시간, 차 번호로 나누어 벡터에 push // 마지막 temp에 입출차 기록이 남음
if (c == ' ') {
v.push_back(temp);
temp = "";
continue;
}
temp += c;
}
carNumbers.insert(v[1]); // 차 번호를 set에 insert
if(temp == "IN")
carRecords[v[1]].push_back({v[0], ""}); // 차 번호에 따라 입차 시간을 기록(출차는 공백으로 둠)
else {
for(int i = 0; i < carRecords[v[1]].size(); i++) {
if (carRecords[v[1]][i].to == "") { // 이전에 입차를 한 차일 경우
carRecords[v[1]][i].to = v[0]; // 출차 시간을 기록
break;
}
}
}
}
vector<int> answer;
for (string carNumber : carNumbers) {
int diffMinute = 0;
for (Time time : carRecords[carNumber]) {
if (time.to == "") { // 입차된 후에 출차된 내역이 없는 경우
time.to = MAX_TO;
}
diffMinute += getDiffMinute(time.from, time.to);
}
int fee = fees[1] + ceil(max(diffMinute - fees[0], 0) / double(fees[2])) * fees[3];
answer.push_back(fee);
}
return answer;
}