알고리즘/프로그래머스
2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 c++
이영재의오른발
2022. 8. 25. 12:31
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
어떻게 풀어야 할지 방향성은 잘 잡았는데 map 컨테이너를 이용해야하는걸 vector를 이용해서 한참 걸렸다.
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
struct car {
string number;
int time;
};
int sum_t(string s1)
{
string h,s;
int t = 0;
h = h + s1[0] + s1[1];
s = s + s1[3] + s1[4];
t = t + stoi(h) * 60 + stoi(s);
return t;
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
vector<car> start;
map<string,int> result;
vector<pair<string,int>> lee;
for(int i=0; i<records.size(); i++) {
istringstream ss(records[i]);
string s1,s2,s3;
ss >> s1 >> s2 >> s3;
if(s3 == "IN") {
int t = sum_t(s1);
start.push_back({s2,t});
}
else {
bool c = false;
for(int j=0; j<start.size(); j++) {
if(start[j].number == s2) {
c = true;
int t1 = sum_t(s1);
int minus_t = t1 - start[j].time;
result[s2] = result[s2] + minus_t;
start.erase(start.begin() + j);
break;
}
}
}
}
for(int i=0; i<start.size(); i++) {
int first = 1439;
int last = start[i].time;
int minus_tmp = first - last;
result[start[i].number] = result[start[i].number] + minus_tmp;
}
for(auto const&pair : result) {
if(pair.second > fees[0]) {
int tmp = fees[1];
double a = pair.second - fees[0];
a = ceil(a/fees[2]);
tmp = tmp + a * fees[3];
lee.push_back({pair.first,tmp});
}
else {
lee.push_back({pair.first,fees[1]});
}
}
sort(lee.begin(),lee.end());
for(int i=0; i<lee.size(); i++) {
answer.push_back(lee[i].second);
}
return answer;
}
<out일 경우에는 일단 out인 차량번호의 차가 in 했을 경우이다>
1. 공백기준으로 문자열을 파싱한 뒤 in 일때는 start vector에 삽입 out 일때는 out의 시간에서 in의 시간을 빼준다.
2. map 컨테이너를 이용해 같은 차량번호일때 빼준 시간을 계속 더해주는 식으로 해서 누적 주차 시간을 갱신해나간다.
3. IN을 한뒤 계속 OUT을 안한 경우 계산
vector를 이용했을때는 같은 차량이 두번이상 들어왔을 경우 생각이 까다로운데 처음 풀이때 map 컨테이너의 인덱스 접근 방법을 잘 몰라서 실수했다.
** map 컨테이너 인자 접근방법 **
for(auto const&pair : result) {
if(pair.second > fees[0]) {
int tmp = fees[1];
double a = pair.second - fees[0];
a = ceil(a/fees[2]);
tmp = tmp + a * fees[3];
lee.push_back({pair.first,tmp});
}
else {
lee.push_back({pair.first,fees[1]});
}
}
728x90
반응형