https://school.programmers.co.kr/learn/courses/30/lessons/92341
또 나온 2022 카카오 블라인드 채용 문제.
문제가 꽤 괜찮은 것 같다는 생각이 든다.
주차장 출입 관리를 하는 솔루션을 작성해야 한다.
입차한 차량이 또 입차하거나, 출차한 차량이 또 출차하는 예외 상황이 없는 것이 정말 다행이었다.
일단 생각의 흐름은 이렇다.
- 입/출차 시간이 "시:분"의 형태로 주어진다
- 분으로 바꿔서 계산해야 한다. - 맵을 적극적으로 사용할 수 있을 것 같다
- 차량 번호 별 비용 계산이나 입출차 확인을 위해 편할 것 같다고 생각했다. - 일단 최종 출차 기록이 있는 차량 확인
- 그럼 자연스럽게 출차 기록이 없는 차량이 남는다
- 다 확인한 후 비용 계산
- 차량 번호 기준 정렬 후 결과 리턴
먼저 기록 확인부터.
let carMap = new Map();
let io = new Map();
let res = new Map();
for (let item of records) {
let record = item.split(" ");
const carNum = record[1];
const time = inMin(record[0]);
if (record[2] === "IN") {
carMap.set(carNum, (carMap.get(carNum) || 0) - time);
io.set(carNum, 1);
} else {
carMap.set(carNum, carMap.get(carNum) + time);
io.set(carNum, 0);
}
}
"IN"이 아니면 무조건 "OUT"이기 때문에 ``else``로 처리 가능.
전부 분으로 처리해 더해준다.
// 출차 없는 차 확인
const maxMin = inMin("23:59");
for (const [carNum, status] of io) {
if (status === 1) {
carMap.set(carNum, carMap.get(carNum) + maxMin);
}
}
출차 이력이 없는 차량들은 "23:59"출차로 간주한다.
이제 보니 저건 전역 상수로 둬도 괜찮았을 것 같다.
// 요금 계산
for (const [carNum, totalMin] of carMap) {
const curFee = res.get(carNum) || 0;
if (totalMin <= fees[0]) {
res.set(carNum, curFee + fees[1]);
} else {
const overFee = Math.ceil((totalMin - fees[0]) / fees[2]) * fees[3];
res.set(carNum, curFee + fees[1] + overFee);
}
}
// 차량 번호 기준 정렬
const sortedRes = new Map([...res.entries()].sort((a, b) => a[0].localeCompare(b[0])));
return [...sortedRes.values()];
요금을 일괄로 계산한다.
요금 관련한 변수들은 보기 좋게 이름을 다 붙여줬어야 했다...
그리고 차량 번호 기준으로 오름차순 정렬한다.
번호가 문자열이므로 문자열 비교를 통해 정렬한다.
그리고 ``value``만 뽑아서 배열로 리턴해 준다.
2 레벨 문제치고 어려운 편은 아니었던 것 같다.
다만 조금 귀찮았다는 생각은 들었다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #17] 롤케이크 자르기 (0) | 2024.09.26 |
---|---|
[TIL #16] 모음사전 (0) | 2024.09.25 |
[TIL #14] k진수에서 소수 개수 구하기 (0) | 2024.09.23 |
[TIL #13] 피로도 (0) | 2024.09.20 |
[TIL #12] 의상 (0) | 2024.09.12 |