๋ฌธ์ ์ ๊ทผ
https://school.programmers.co.kr/learn/courses/30/lessons/92341
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์ ๋ฅผ ์ดํด๋ณด๋ฉด ๊ท์น์ ๋ฐ๋ผ ์ฃผ์ฐจ ์๊ธ์ ๊ณ์ฐํ๋ ๊ตฌํ ๋ฌธ์ ์์ ์ฝ๊ฒ ํ์ ํ ์ ์์
=> ๊ท์น๋ค์ ์ดํด๋ณด๊ณ ๋ฏธ๋ฆฌ ์ฃผ์์ผ๋ก ๊ตฌํํด์ผํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ๊ณ ํ์ด๋ฅผ ์์ํจ
๋ฌธ์ ํ์ด
์ฐ์ ์ ๋ ฅ์ด ์๋ชป๋ค์ด์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ์กฐ๊ฑด์ด ์ฃผ์ด์ ธ์์ผ๋ฏ๋ก ์์ธ์ฒ๋ฆฌ๋ ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์๋๋จ
๋ํ, ๊ธฐ๋ณธ ์๊ธ์ด ๋ถ ๋จ์์ด๊ธฐ์ ๋ ์ฌ์ด ์๊ฐ ๊ณ์ฐ์ ์ํด ์ ์ฐจ, ์ถ์ฐจ ์๊ฐ์ ๋ถ์ผ๋ก ๋ณํํ๊ณ ๋ชจ๋ ๋ก์ง์ ์ํํจ
์ฐ์ ๋์ (ํ๋์ ์ฐจ๋์ด ์ฌ๋ฌ๋ฒ IN, OUT์ ํ ์ ์์) ์ฃผ์ฐจ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋น์ฉ์ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ ๋์ ์ถ๊ฐ ์๊ฐ์ ๊ด๋ฆฌํ๋ Map๊ณผ ์ ์ฐจ (ํ์ฌ ์ฃผ์ฐจ๋์ด ์๋ ์ฐจ)๋ฅผ ๊ด๋ฆฌํ๋ Map์ ์ ์ธํ์์
๋ง์ฝ IN์ผ ๊ฒฝ์ฐ๋ ๋จ์ํ parkingMap์ ์ฐจ๋ ๋ฒํธ์ ์ ์ฐจ ์๊ฐ์ ์ ์ฅํด์ค
OUT์ผ ๊ฒฝ์ฐ๋ ํด๋น ์ฐจ๋ ๋ฒํธ์ ์ ์ฐจ์๊ฐ์ parkingMap์์ ๊ฐ์ ธ์จ ํ ์ถ์ฐจ ์๊ฐ์์ ๋นผ์ค์ ๋์ ์ฃผ์ฐจ ์๊ฐ(๋จ์ : ๋ถ)์ ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ด๋ฆฌํ๋ timeMap์ ์ ์ฅํจ
(์ด ๋ OUT์ ์ถ์ฐจ๋ฅผ ์๋ฏธํ๋ฏ๋ก ํ์ฌ ์ฃผ์ฐจ๋ ์ฐจ๋ฅผ ์ ์ฅํ๋ parkingMap์์ removeํด์ค์ผํจ)
์ด๋ ๊ฒ for๋ฌธ์ ๋๋ฉด์ ์ฃผ์ด์ง ์ /์ถ์ฐจ ๊ธฐ๋ก์ ๋ค ๋ฐ์ํ๋ค๋ฉด parkingMap์ ๋จ์ ๋๊น์ง ์ถ์ฐจ๋์ง ์์ ์ฐจ๋๋ค์ 23:59๋ฅผ ๊ธฐ์ค์ผ๋ก ์ถ์ฐจ์์ผ์ผํจ
for๋ฌธ์ผ๋ก parkingMap์ ์ฐจ๋ ๋ฒํธ์ ์ ๊ทผํ๋ฉฐ ์์์ ๋งํ OUT ๋ก์ง์์ ์ถ์ฐจ ์๊ฐ๋ง 23:59๋ก ํ์ฌ ๋์ผํ ๋ก์ง์ ๋๋ฆผ
๋ง์ง๋ง์ผ๋ก ์ฐจ๋ ๋ฒํธ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ ์ํ์์ ์ฃผ์ฐจ ์๊ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผํ๋ฏ๋ก TreeMap(key๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋ Map)์ ์ ์ธํ ํ ์๊ธ ๊ณ์ฐ ๋ก์ง์ ๋๋ฆฌ๋ฉด๋จ
=> ๊ธฐ๋ณธ ์๊ธ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ํด๋น ์ฐจ๋์ ์ด ๋์ ์ฃผ์ฐจ ์๊ฐ์ด ๊ธฐ๋ณธ ์๊ฐ์ ๋์ด๊ฐ๊ฒ๋๋ฉด ํด๋น ์๊ฐ์ ๋ฐ๋ฅธ ์๊ธ์ ์ถ๊ฐํด์ค
์ ์ฒด ์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
int basicTime = fees[0];
int basicFee = fees[1];
int unitTime = fees[2];
int unitFee = fees[3];
// 1. ์
์ฐจ ์ฐจ๋ ๊ด๋ฆฌ Map (key: ์ฐจ๋๋ฒํธ, value: ์
์ฐจ์๊ฐ(๋ถ))
Map<String, Integer> parkingMap = new HashMap<>();
// 2. ๋์ ์ฃผ์ฐจ ์๊ฐ ๊ด๋ฆฌ Map (key: ์ฐจ๋๋ฒํธ, value: ๋์ ์๊ฐ(๋ถ))
Map<String, Integer> timeMap = new HashMap<>();
for (String record : records) {
String[] arr = record.split(" ");
String[] timeArr = arr[0].split(":");
int time = Integer.parseInt(timeArr[0]) * 60 + Integer.parseInt(timeArr[1]);
String carNumber = arr[1];
String type = arr[2];
if (type.equals("IN")) {
parkingMap.put(carNumber, time);
} else { // OUT
// ์
์ฐจ ์๊ฐ ๊ฐ์ ธ์ค๊ธฐ
int inTime = parkingMap.get(carNumber);
// ์ฃผ์ฐจ ์๊ฐ = ์ถ์ฐจ ์๊ฐ - ์
์ฐจ ์๊ฐ
int parkingDuration = time - inTime;
// ํด๋น ์ฐจ๋์ ๋์ ์ฃผ์ฐจ ์๊ฐ์ ํฉ์ฐ
timeMap.put(carNumber, timeMap.getOrDefault(carNumber, 0) + parkingDuration);
// ์ถ์ฐจํ์ผ๋ฏ๋ก ์
์ฐจ ๋ชฉ๋ก์์ ์ ๊ฑฐ
parkingMap.remove(carNumber);
}
}
// 3. ์ถ์ฐจ ๊ธฐ๋ก์ด ์๋ ์ฐจ๋ ์ฒ๋ฆฌ (23:59 ์ถ์ฐจ๋ก ๊ฐ์ฃผ)
int lastTime = 23 * 60 + 59;
for (String carNumber : parkingMap.keySet()) {
int inTime = parkingMap.get(carNumber);
int parkingDuration = lastTime - inTime;
timeMap.put(carNumber, timeMap.getOrDefault(carNumber, 0) + parkingDuration);
}
// 4. ๋์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ต์ข
์๊ธ ๊ณ์ฐ
// ์ฐจ๋ ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด TreeMap ์ฌ์ฉ
Map<String, Integer> feeMap = new TreeMap<>();
for (String carNumber : timeMap.keySet()) {
int totalTime = timeMap.get(carNumber);
// ๊ธฐ๋ณธ ์๊ธ
int fee = basicFee;
// ๊ธฐ๋ณธ ์๊ฐ ์ด๊ณผ ์ ์ถ๊ฐ ์๊ธ ๊ณ์ฐ
if (totalTime > basicTime) {
// ์ด๊ณผํ ์๊ฐ์ ๋จ์ ์๊ฐ์ผ๋ก ๋๋๊ณ ์ฌ๋ฆผ ์ฒ๋ฆฌ
int overTime = totalTime - basicTime;
int count = (int) Math.ceil((double) overTime / unitTime);
fee += count * unitFee;
}
feeMap.put(carNumber, fee);
}
// 5. ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐํ
int[] answer = new int[feeMap.size()];
int i = 0;
for (int fee : feeMap.values()) {
answer[i++] = fee;
}
return answer;
}
}
'๐ฅ Algorithm > ๊ตฌํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค] ์ค์ต์ฉ ๋ก๋ด (JAVA ํ์ด) (0) | 2025.11.02 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค] ์ธํจ์ด ์ํ๋ฒณ (JAVA ํ์ด) (0) | 2025.10.29 |
| [ํ๋ก๊ทธ๋๋จธ์ค] k์ง์์์ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ (JAVA ํ์ด) (0) | 2025.10.25 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ์ ๊ณ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ (JAVA ํ์ด) (0) | 2025.10.24 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ํคํจ๋ ๋๋ฅด๊ธฐ (JAVA ํ์ด) (0) | 2025.10.16 |