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
- 자료구조
- 프로그래머스
- 웹
- 항해99
- 프로그래밍 언어
- 코드트리
- Java
- 개발자취업
- 데이터베이스
- 플로이드-워셜
- 운영체제
- 코딩테스트준비
- 파이썬
- 개발자루틴
- 연결 리스트
- C
- 99클럽
- 코테공부
- 알고리즘
- 코딩테스트
- 자바스크립트
- 티스토리챌린지
- 코딩테스트사이트추천
- 자바
- 오블완
- 인접 행렬
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 1일1코테
- 갭체크
- til
Archives
- Today
- Total
와드의 블로그
주차 요금 계산 본문
문제
주차장의 요금표와 차량이 들어오고(IN) 나간(OUT) 기록이 주어집니다. 차량별로 누적 주차 시간을 계산하여, 누적 주차 시간이 기본 시간을 초과하면 초과한 시간에 대해 단위 시간마다 단위 요금을 청구합니다. (단, 출차 기록이 없다면 23:59에 출차한 것으로 간주합니다.) 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아 반환하는 프로그램을 작성하는 문제입니다.
- 입력: 주차 요금표를 나타내는 정수 배열 fees (기본 시간, 기본 요금, 단위 시간, 단위 요금), 자동차의 입출차 내역 records
- 출력: 차량 번호가 작은 자동차부터 주차 요금을 차례대로 담은 정수 배열
링크: https://school.programmers.co.kr/learn/courses/30/lessons/92341
풀이: TreeMap을 활용한 누적 시간 계산과 정렬
입출차 기록이 여러 번 있을 수 있으므로, 모든 주차 시간을 먼저 누적한 뒤 마지막에 한 번만 요금을 계산하는 것이 이 문제의 핵심입니다. 또한 차량 번호 기준 오름차순 정렬이 필요하므로 키(Key)를 기준으로 자동 정렬되는 TreeMap을 활용합니다.
- 시간 변환: "HH:MM" 형식의 문자열을 다루기 쉽도록 모두 분(minute) 단위의 정수로 변환하여 계산합니다. (시간 * 60 + 분)
- 입출차 처리 및 시간 누적:
- map (HashMap): 입차한 차량의 번호와 입차 시간을 기록합니다.
- timeMap (TreeMap): 출차할 때마다 (출차 시간 - 입차 시간)을 계산하여 해당 차량의 누적 주차 시간에 더해줍니다. 이후 map에서 해당 차량을 제거합니다. TreeMap을 사용했기 때문에 차량 번호순으로 자동 정렬됩니다.
- 미출차 차량 처리: records 순회가 끝난 후에도 map에 남아있는 차량들은 출차 기록이 없는 차량입니다. 이들은 "23:59"에 출차한 것으로 간주하여 남은 시간을 timeMap에 누적해 줍니다.
- 최종 요금 계산: timeMap에 저장된 각 차량의 '총 누적 주차 시간'을 바탕으로 문제의 공식에 맞게 요금을 계산합니다. 올림 처리는 정수 나눗셈의 특성((시간 - 1) / 단위 + 1)을 활용하여 처리한 뒤 결과 배열에 담습니다.
코드
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
Map<String, String> map = new HashMap<>();
Map<String, Integer> timeMap = new TreeMap<>();
for (int i = 0; i < records.length; i++) {
String[] tmp = records[i].split(" ");
String t = tmp[0];
String n = tmp[1];
String cmd = tmp[2];
if (cmd.equals("IN")) {
map.put(n, t);
} else {
int time = calTime(map.get(n), t);
timeMap.put(n, timeMap.getOrDefault(n, 0) + time);
map.remove(n);
}
}
for (String n : map.keySet()) {
int time = calTime(map.get(n), "23:59");
timeMap.put(n, timeMap.getOrDefault(n, 0) + time);
}
int[] ans = new int[timeMap.size()];
int idx = 0;
for (String n : timeMap.keySet()) {
ans[idx++] = calFee(timeMap.get(n), fees);
}
return ans;
}
int calTime(String s, String e) {
int sInt = Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3));
int eInt = Integer.parseInt(e.substring(0, 2)) * 60 + Integer.parseInt(e.substring(3));
return eInt - sInt;
}
int calFee(int time, int[] fees) {
if (time <= fees[0]) {
return fees[1];
} else {
return fees[1] + fees[3] * ((time - fees[0] + fees[2] - 1) / fees[2]);
}
}
}
알고리즘 분류
구현 (Implementation), 문자열 (String), 해시를 사용한 맵 (Hash Map, Tree Map)