Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- Google OAuth
- factory
- 일급 컬렉션
- OAuth 2.0
- builder
- 일급 객체
- Volatile
- java
- Spring
- synchronized
- lombok
- Dependency Injection
- spring security
Archives
- Today
- Total
HJW's IT Blog
[Programmers] KAKAO BLIND 주차요금 계산 (C++) 본문
문제



제한사항
- fees 배열의 길이는 4 고정
- fees[0] = 기본 시간
- fees[1] = 기본 요금
- fees[2] = 단위 시간
- fees[3] = 단위 요금
- records 배열은 문자열 배열이다
- 형식은 [시각 차량번호 IN/OUT] 이다
- 입차기록이 있지만 출차 기록이 없다면 23:59분에 출차한 것으로 간주한다
- 주차장에 없는 차량이 출차되거나, 이미 있는 차량이 다시 입차되는 경우는 없다
- 잘못된 시각은 입력으로 주어지지 않는다.
풀이
- 문제에서 주차장에 없는 차량이 출차되거나 이미 있는 차량이 다시 입차되는 경우는 없다고 하였다.
- 즉 같은 차량 번호라면 무조건 -> 입차, 출차, 입차, 출차 순으로
- map 을 생성하여 한 차량 번호에 대한 시각을 모두 기록해 놓았다
- 이때, 시간은 00:00 ~ 23:59 까지 이기 때문에 모두 분으로 변경하여 저장하였다.
- 또한 입차 기록은 있지만 출차 기록이 없을 경우 계산하기 위한 최대 시간 변수도 생성하였다.
- 차량별로 저장된 시간을 돌며, 입차와 출차 사이의 시간을 계산, 후 다른 map에 저장해 주었다
- 출차 기록이 없는 차량을 위해 다음 조건문을 걸었다
- if(차량 시간 백터 % 2 != 0 && j == 차량시간백터.size() - 1)
- 마지막 요소이면서 저장된 차량의 시간 수가 홀수일 경우 출차기록이 없는것이므로
- 그 외의 값에 대해서는, 현제 index j 가 홀수라면 출차, 짝수라면 입차이기 때문에 출차일 때 입차 기록을 확인하여 계산해 주었다
- if(차량 시간 백터 % 2 != 0 && j == 차량시간백터.size() - 1)
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <cmath>
using namespace std;
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
map<string, vector<int>> m;
map<string, int> m2;
int max = 23 * 60 + 59;
string current;
for(int i = 0; i<records.size(); i++){
string temp = records[i].substr(6,4);
int temp_hour = stoi(records[i].substr(0,2));
int temp_min = stoi(records[i].substr(3,2));
int time = (temp_hour * 60) + temp_min;
m[temp].push_back(time);
}
for(auto i : m){
for(int j = i.second.size() - 1 ; j >= 1; j--){
if(i.second.size() % 2 != 0 && j == i.second.size() - 1){
m2[i.first] += (max - i.second[j]);
}else if(j%2 == 1){
m2[i.first] += (i.second[j] - i.second[j-1]);
}else if(j%2 == 0){
continue;
}
}
if(i.second.size() == 1){
m2[i.first] += (max - i.second[0]);
}
}
for(auto i : m2){
double calc = 0;
if(i.second > fees[0]){
calc = fees[1] + ceil(static_cast<double>(((i.second - fees[0])) / static_cast<double>(fees[2]))) * fees[3];
}else{
calc = fees[1];
}
answer.push_back(calc);
}
return answer;
* 처음에 풀때, 중간 차량번호를 기준으로 정렬을 하고 시작했더니 오답이 나왔다,,, 이유는 아직 모르겠다
* 그러다 검색하던중, map은 기본적으로 오름차순 정렬이라하여 정렬 코드를 제거했더니 통과
'Algorithm' 카테고리의 다른 글
| [Programmers] 도넛과 막대 그래프 [c++] (0) | 2024.07.29 |
|---|---|
| [Programmers] 가장 많이 받은 선물 [C++] (0) | 2024.07.29 |
| [Programmers] 2022 KAKAO BLIND 양궁대회 (C++) (0) | 2024.03.27 |
| [BOJ][Python]1003: 피보나치 함수 (0) | 2023.04.01 |
| [BOJ][C++][Python] 17219번: 비밀번호 찾기 (0) | 2023.03.31 |