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 |
Tags
- 네트워크
- 해시맵
- BFS
- 해시
- programmers
- 브루트포스
- 동적계획법
- switch
- 그리디
- 스프링
- boj
- 알고리즘
- 이분탐색
- DP
- broadcast
- greedy
- Network
- 백준
- Algorithm
- DFS
- 프로그래머스
- 구현
- Spring
- DynamicProgramming
- 너비우선탐색
- 깊이우선탐색
- 백트래킹
- HashMap
- Backtracking
- dynamic programming
Archives
- Today
- Total
옌의 로그
[Algorithm] 프로그래머스 - 주차 요금 계산 본문
문제
[프로그래머스] 주차 요금 계산
(2022 KAKAO BLIND RECRUITMENT)
사용 알고리즘
- HASH MAP
해결방법
- 입-출차 시간을 기록하는 carMap, 주차 시간을 기록하는 parkTime 두개의 map을 사용하여 해결
- records 맵을 돌며 입차인 경우 (IN) carMap에 저장해주고, 출차인 경우 (OUT) carMap 에 저장된 입차 시간을 꺼내 몇 분간 주차했는지 계산하여 parkTime에 저장한다. 이때 계산에 사용된 입차기록은 carMap 에서 삭제
- records 확인 후 carMap 에 입차 기록이 남아있는 경우 23:59에 출차한 것으로 가정 후 주차 시간 계산
- 여기서 포인트는. . 'HH:mm' 형식으로 들어오는 시간 데이터를 H에 60을 곱해 분단위로 바꾸어 계산해 주는 것.
- 그렇게 하지 않으려면 javascript에선 Date() 객체를 써야하므로 복잡해진다.
- parkTime 맵을 오름차순으로 sorting 후 주차요금 계산
소스코드
사용언어 : javascript
function solution(fees, records) {
let answer = [];
let carMap = new Map(); // 입-출차 시간맵
let parkTime = new Map(); // 주차시간 기록 맵
for (let r of records) {
let info = r.split(" ");
if (info[2] == 'IN') { //입차인 경우 carMap에 기록
carMap.set(info[1], info[0]); // carNum => inputTime
} else { // 출차인 경우 주차시간 계산 후 carMap에서 삭제
let inTime = carMap.get(info[1]);
let inHourMin = inTime.split(":");
let outHourMin = info[0].split(":");
let inMin = inHourMin[0] * 60 + parseInt(inHourMin[1]);
let outMin = outHourMin[0] * 60 + parseInt(outHourMin[1]);
const elapsedMin = outMin - inMin; // 주차시간(분)
if (parkTime.has(info[1])) {
parkTime.set(info[1], parkTime.get(info[1]) + elapsedMin);
} else {
parkTime.set(info[1], elapsedMin);
}
carMap.delete(info[1]);
}
}
for (let [carNum, inTime] of carMap) { // 출차 기록 없는 차량 체크
let inHourMin = inTime.split(":");
let inMin = inHourMin[0] * 60 + parseInt(inHourMin[1]);
let outMin = 23 * 60 + 59;
const elapsedMin = outMin - inMin;
if (parkTime.has(carNum)) {
parkTime.set(carNum, parkTime.get(carNum) + elapsedMin);
} else {
parkTime.set(carNum, elapsedMin);
}
}
const sortParkMap = new Map([...parkTime].sort());
for (let value of sortParkMap.values()) { // 주차요금 계산
let stdTime = fees[0];
let stdFee = fees[1];
let unitTime = fees[2];
let unitMoney = fees[3];
if (value <= stdTime) {
answer.push(stdFee);
} else {
let amount = stdFee + Math.ceil((value - stdTime) / unitTime) * unitMoney;
answer.push(amount);
}
}
return answer;
}
Map 객체 정렬하기
> https://llnote.tistory.com/656
[Javascript] Map 객체 정렬하는 법
@ 방법 const myMap = new Map(); myMap.set("a",3); myMap.set("c",4); myMap.set("b",1); myMap.set("d",2); // sort by value const mapSort1 = new Map([...myMap.entries()].sort((a, b) => b[1] - a[1])); console.log(mapSort1); // Map(4) {"c" => 4, "a" => 3, "d"
llnote.tistory.com
* sort by key
const sortParkMap = new Map([...parkTime].sort());
* ... 연산자 : 비구조화 할당 (destructuring assignment) 구문
* 배열[], 혹은 객체 {} 안의 값을 편하게 꺼내 쓸 수 있는 문법

한줄평
Map sort 하는 부분 빼고는 크게 어려움 없는 문제였다.
'스터디 > 알고리즘' 카테고리의 다른 글
[Algorithm] 프로그래머스 - 표 편집 (0) | 2023.03.03 |
---|---|
[Algorithm] 프로그래머스 - 정수 삼각형 (0) | 2023.02.01 |
[Algorithm] 프로그래머스 - 등산코스 정하기 (5) | 2023.01.25 |
[Algorithm] 프로그래머스 - 셔틀버스 (1) | 2023.01.23 |
[Algorithm] 프로그래머스 - 압축 (0) | 2023.01.11 |