🔗 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🖍 풀이
간단하게 나누면 세 과정이다.
- records[i]를 차번호, 시, 분, 상태로 파싱
- 시간 값을 2개씩 꺼내 총 주차 시간을 구한다.
- 소수는 올림으로 처리해서 요금을 매긴다.
하지만 간단하지 않다.
나는 이 문제를 푸는데 자그마치 2시간이나 걸렸다..
- 소수점 처리에서 막혔다.
- 출차가 없는 경우의 처리에서 막혔다.
1) records[i]를 차번호, 시, 분, 상태로 파싱
문제에 차 번호가 4자리로 제한되어 최대 자동차 번호는 9999인 것을 알 수 있다.
또한, 시간 순으로 정보가 주어지기 때문에 OUT, IN을 정렬할 필요가 없다.
그래서 무식하지만 std::queue로 info[9999]로 선언했다.
for(int i=0; i<records.size(); ++i)
{
int h = std::stoi(records[i].substr(0, 2));
int m = std::stoi(records[i].substr(3, 2));
int car = std::stoi(records[i].substr(6, 4));
std::string state = records[i].substr(11, records[i].length()-11);
// 분 단위로 변환도 여기서 해주었다.
int min = (h*60) + m;
info[car].push(min);
}
2) 시간 값을 2개씩 꺼내 총 주차 시간을 구한다.
for(int i=0; i<9999; ++i)
{
min[i] = 0;
while(!info[i].empty())
{
int in = info[i].front(); info[i].pop();
int out = (23*60) + 59;
if(!info[i].empty())
{
out = info[i].front(); info[i].pop();
}
min[i]+= (out-in);
}
}
3) 소수는 올림으로 처리해서 요금을 매긴다.
//기본 주차 시간 내이면 기본료만 내면 된다.
if(fees[0] >= min[i])
answer.push_back(fees[1]);
else
{
// 여기서 소수 처리 중요.
int ceil = (min[i]-fees[0])/fees[2];
//소수점이 남아있다면 1더해준다.
if(min[i]-fees[0]%fees[2] !=0)
ceil +=1;
answer.push_back(fees[1] + ceil*fees[3]);
}
💾 소스
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
std::queue<int> info[9999];
int min[9999] = {-1, };
for(int i=0; i<records.size(); ++i)
{
//parsing
int h = std::stoi(records[i].substr(0, 2));
int m = std::stoi(records[i].substr(3, 2));
int car = std::stoi(records[i].substr(6, 4));
std::string state = records[i].substr(11, records[i].length()-11);
int min = (h*60) + m;
info[car].push(min);
}
for(int i=0; i<9999; ++i)
{
min[i] = 0;
while(!info[i].empty())
{
int in = info[i].front(); info[i].pop();
int out = (23*60) + 59;
if(!info[i].empty())
{
out = info[i].front(); info[i].pop();
}
min[i]+= (out-in);
}
}
for(int i=0; i<9999; ++i)
{
if(min[i]!=0)
{
if(fees[0] >= min[i])
answer.push_back(fees[1]);
else
{
int tmp = std::ceil((min[i]-fees[0])/fees[2]);
if((min[i]-fees[0])%fees[2] != 0)
tmp+=1;
answer.push_back(fees[1] + (tmp*fees[3]));
}
}
}
return answer;
}