-
[프로그래머스] Level2 - 주차 요금 계산코딩 테스트 2022. 10. 5. 14:20
1. 문제 설명
Link : https://school.programmers.co.kr/learn/courses/30/lessons/92341
2. 나의 풀이
#include <string> #include <vector> #include <map> #include <sstream> #include <cmath> using namespace std; struct ParkingData { int recentTime; int acc; bool parked; ParkingData() : recentTime(0), acc(0), parked(false) { } }; vector<int> solution(vector<int> fees, vector<string> records) { int baseTime = fees[0]; int baseFee = fees[1]; int unitTime = fees[2]; int unitFee = fees[3]; map<int, ParkingData> mapParkData; int hour, minute, plateNum; string buf; stringstream ss; for (int i = 0; i < records.size(); ++i) { ss << records[i]; // Time getline(ss, buf, ':'); hour = stoi(buf); ss >> minute; // 번호판 숫자 ss >> plateNum; // 처음 주차하는 것인지 확인 auto find = mapParkData.find(plateNum); if (find == mapParkData.end()) { ParkingData data; data.recentTime = hour * 60 + minute; data.parked = true; mapParkData.insert(make_pair(plateNum, data)); } else { // 주차된 상태에서 밖으로 나가는 경우 // 누적 시간 계산하고 out처리 if (find->second.parked) { find->second.acc += (hour * 60 + minute) - find->second.recentTime; find->second.parked = false; } // 다시 주차하러 들어온 경우 // 주차하러 들어온 시간 update else { find->second.recentTime = hour * 60 + minute; find->second.parked = true; } } ss.str(""); } vector<int> answer; auto iter = mapParkData.begin(); auto iterEnd = mapParkData.end(); for (; iter != iterEnd; ++iter) { // 아직 주차상태인 경우 11:59 기준으로 정산 if (iter->second.parked) { iter->second.acc += (23 * 60 + 59) - iter->second.recentTime; } int fee; if (iter->second.acc <= baseTime) { fee = baseFee; } else { fee = baseFee + ceil((float)(iter->second.acc - baseTime) / unitTime) * unitFee; } answer.push_back(fee); } return answer; }
map은 key기준 오름차순으로 정렬되므로 vector로 답을 리턴할 때 따로 정렬해줄 필요가 없다.
주차 정보 구조체를 만들어놓고, key값을 번호판 번호로 하여 map에 넣었다.
주차장에 들어올 때 들어온 시간 갱신, 나갈 때 주차 시간 누적해주는 방식으로 번호별 누적 시간을 계산하고,
map을 순회하며 최종 요금을 계산해주는 방식으로 구현했다.
3. 다른 사람들의 풀이
#include <bits/stdc++.h> using namespace std; int conv(string& t) { int h = (t[0] - 48) * 10 + t[1] - 48; int m = (t[3] - 48) * 10 + t[4] - 48; return h * 60 + m; } vector<int> solution(vector<int> fees, vector<string> records) { vector<int> vec[10000]; for (auto& record : records) { stringstream ss(record); string a, b, c; ss >> a >> b >> c; vec[stoi(b)].push_back(conv(a)); } vector<int> ans; for (int i = 0; i < 10000; ++i) if (!vec[i].empty()) { if (vec[i].size() & 1) vec[i].push_back(23 * 60 + 59); int sum = 0; for (int j = 1; j < vec[i].size(); j += 2) sum += vec[i][j] - vec[i][j - 1]; int val = fees[1]; if (sum > fees[0]) val += (sum - fees[0] + fees[2] - 1) / fees[2] * fees[3]; ans.push_back(val); } return ans; }
언제쯤 이렇게 깔끔하게 짤 수 있을까
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] Level2 - k진수에서 소수 구하기 (0) 2022.10.06 [프로그래머스] Level2 - 두 큐 합 같게 만들기 (1) 2022.09.29 [프로그래머스] Level1 - 신고 결과 받기 (0) 2022.09.27 [프로그래머스] Level1 - 완주하지 못한 선수 (0) 2022.09.20 [프로그래머스] Level1 - 다트 게임 (0) 2022.09.15