https://school.programmers.co.kr/learn/courses/30/lessons/92341
๐ ๋ฌธ์ ์์ฝ
์ ๋ ฅ
- ์
๋ ฅ๊ฐ : ์ฃผ์ฐจ ์๊ธํ(fees), ์ฐจ๋์ ์
์ฐจ/์ถ์ฐจ ๊ธฐ๋ก(records)
- ์์
- fees [180, 5000, 10, 600] : ๊ธฐ๋ณธ ์๊ฐ(๋ถ), ๊ธฐ๋ณธ ์๊ธ(์), ๋จ์ ์๊ฐ(๋ถ), ๋จ์ ์๊ธ(์)
- records ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] : ์๊ฐ(์:๋ถ), ์ฐจ๋ ๋ฒํธ, ๋ด์ญ
- ์์
- ๊ฒฐ๊ณผ๊ฐ : ์ฐจ๋ ๋ฒํธ๊ฐ ์์ ์๋์ฐจ๋ถํฐ ์ฒญ๊ตฌํ ์ฃผ์ฐจ ์๊ธ
- ์์
- [14600, 34400, 5000]
- ์์
์กฐ๊ฑด
- ์ ์ฐจ๋ ํ ์ถ์ฐจ๋ ๋ด์ญ ์์ผ๋ฉด 23:59์ ์ถ์ฐจ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
- ์ฐจ๋๋ณ ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ณ์ฐํ์ฌ ์๊ธ์ ์ผ๊ด๋ก ์ ์ฐ
- ๋์ ์ฃผ์ฐจ ์๊ฐ์ด ๊ธฐ๋ณธ ์๊ฐ์ดํ๋ผ๋ฉด, ๊ธฐ๋ณธ ์๊ธ
- ๊ธฐ๋ณธ ์๊ฐ์ ์ด๊ณผํ๋ฉด, ๊ธฐ๋ณธ ์๊ธ์ ๋ํด์, ์ด๊ณผํ ์๊ฐ์ ๋ํด์ ๋จ์ ์๊ฐ ๋ง๋ค ๋จ์ ์๊ธ์ ์ฒญ๊ตฌ
- ์ด๊ณผํ ์๊ฐ์ด ๋จ์ ์๊ฐ์ผ๋ก ๋๋์ด ๋จ์ด์ง์ง ์์ผ๋ฉด, ์ฌ๋ฆผ
์ ํ
- fees์ ๊ธธ์ด = 4
- 1 ≤ records์ ๊ธธ์ด ≤ 1,000
๐ก ๊ตฌํํ๊ธฐ
์๋ฃ ๊ตฌ์กฐ
- HashMap
- ์๊ฐ๋ณต์ก๋ : put - O(1), get - O(1), containskey - O(1)
- ArrayList์ ๋น๊ต : add - O(n), get - O(1), remov(1)
- recordMap : ์ฐจ๋ ๋ฒํธ๋ฅผ key๋ก ํด์, ์ ์ฐจ ์๊ฐ์ ์ ์ฅ
- ์๊ฐ๋ณต์ก๋ : put - O(1), get - O(1), containskey - O(1)
- TreeMap
- SortedMap ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค
- timeMap : ์ฐจ๋ ๋ฒํธ๋ฅผ key๋ก ํด์, ๋์ ์ฃผ์ฐจ ์๊ฐ์ value์ ์ ์ฅ
๋ก์ง
- records๋ฅผ ์ฝ์ด์, ๋ฌธ์์ด ํ์ฑ
- IN(์ ์ฐจ)๋ฉด recordMap์ ๋ฃ๊ณ ,
- OUT์ด๋ฉด recordMap์ ์ ์ฅ๋ ์ ์ฐจ ์๊ฐ์ ๊บผ๋ด์ → ์ฃผ์ฐจ ์๊ฐ์ ๊ณ์ฐ
- ๋์ ์ฃผ์ฐจ ์๊ฐ ๊ธฐ๋กํ๊ธฐ
- timeMap์ ์์ผ๋ฉด ์๊ธ ๋์ ์ํค๊ณ
- ์์ผ๋ฉด timeMap์ ์๋ก ๋ฃ๊ธฐ
- ์ถ์ฐจ๋ ๋ด์ญ์ด ์์ผ๋ฉด, ์ผ๊ด 23:59๋ก ์ ์ฉํด์ → ์ฃผ์ฐจ ์๊ฐ ๊ณ์ฐ → ๋์ ์ฃผ์ฐจ ์๊ฐ์ ๊ธฐ๋กํ๊ธฐ
- ์๊ธํ์ ๋ฐ๋ผ ์๊ธ ๊ณ์ฐํ๊ธฐ
๐ฉ๐ป๐ป ์ฝ๋
import java.util.*;
class Solution {
static Map<String, Integer> timeMap; //key: ์ฐจ๋๋ฒํธ, value: ๋์ ์ฃผ์ฐจ ์๊ฐ
public int[] solution(int[] fees, String[] records) {
//records
HashMap<String, String> recordMap = new HashMap<>(); //key: ์ฐจ๋๋ฒํธ, value: ์๊ฐ
timeMap = new TreeMap<>(); //์ฐจ๋ ๋ฒํธ ์์ ์๋์ฐจ ์์ผ๋ก ์ ๋ ฌ๋๊ฒ
for(int i = 0; i < records.length; i++) {
String[] strs = records[i].split(" ");
String time = strs[0];
String num = strs[1];
String status = strs[2];
if(status.equals("IN")) { //์
์ฐจ
recordMap.put(num, time); //๋งต์ ๋ฃ๊ธฐ
} else { //์ถ์ฐจ
String inTime = recordMap.get(num);
recordMap.remove(num);
//์ฃผ์ฐจ์๊ฐ ๊ณ์ฐ
int parkTime = getParkTime(inTime, time); //์
์ฐจ์๊ฐ, ์ถ์ฐจ์๊ฐ
//๋์ ์ฃผ์ฐจ ์๊ฐ ๊ธฐ๋ก
if(timeMap.containsKey(num)) { //๋์ ์ฃผ์ฐจ ์๊ฐ ๊ธฐ๋ก์ ์์ผ๋ฉด
int minSum = timeMap.get(num);
timeMap.put(num, minSum + parkTime); //์๊ธ ๋์ ์ํค๊ธฐ
} else { //์๊ฐ ๊ธฐ๋ก์ ์์ผ๋ฉด
timeMap.put(num, parkTime); //์๋ก ๋ฃ๊ธฐ
}
}
}
//์ถ์ฐจ๋ ๋ด์ญ์ด ์์
for(String key : recordMap.keySet()) {
String inTime = recordMap.get(key);
//์ฃผ์ฐจ์๊ฐ ๊ณ์ฐ
int parkTime = getParkTime(inTime, "23:59"); //์
์ฐจ์๊ฐ, ์ถ์ฐจ์๊ฐ
//๋์ ์ฃผ์ฐจ ์๊ฐ ๊ธฐ๋ก
if(timeMap.containsKey(key)) { //์๊ธ ๊ธฐ๋ก์ ์์ผ๋ฉด
int minSum = timeMap.get(key);
timeMap.put(key, minSum + parkTime); //์๊ธ ๋์ ์ํค๊ธฐ
} else { //์๊ธ ๊ธฐ๋ก์ ์์ผ๋ฉด
timeMap.put(key, parkTime); //์๋ก ๋ฃ๊ธฐ
}
}
//์๊ธ ๊ณ์ฐํ๊ธฐ
int[] answer = new int[timeMap.size()];
int idx = 0;
for(String key : timeMap.keySet()) {
int minSum = timeMap.get(key);
System.out.println(minSum);
int fee = calculateFee(fees, minSum);
answer[idx] = fee;
idx++;
}
return answer;
}
public int calculateFee(int[] fees, int minSum) { //์๊ธํ, ๋์ ์ฃผ์ฐจ ์๊ฐ
//fees
int standardTime = fees[0];
int standardFee = fees[1];
int unitTime = fees[2];
int unitFee = fees[3];
int fee = 0;
if(minSum <= standardTime) { //๊ธฐ๋ณธ ์๊ฐ์ดํ
fee = standardFee;
} else { //๊ธฐ๋ณธ ์๊ฐ์ด๊ณผ
fee = standardFee + (int)Math.ceil((minSum - standardTime) / (double)unitTime) * unitFee;
}
return fee;
}
public int getParkTime(String inTime, String outTime) { //์
์ฐจ์๊ฐ, ์ถ์ฐจ์๊ฐ
String[] inTimeStr = inTime.split(":");
String[] outTimeStr = outTime.split(":");
int inMinute = Integer.parseInt(inTimeStr[0]) * 60 + Integer.parseInt(inTimeStr[1]);
int outMinute = Integer.parseInt(outTimeStr[0]) * 60 + Integer.parseInt(outTimeStr[1]);
return outMinute - inMinute;
}
}
๐ ๊ฒฐ๊ณผ
๐ค ํ๊ธฐ
- ์๊ฐ๋ณต์ก๋ ๊ฐ์ ์ ์ํ ์๋ฃ๊ตฌ์กฐ ์๊ฐํ๊ธฐ
- ์ฒ์์๋ ArrayList ์ฐ๋ ค๊ณ ํ๋๋ฐ, ์๊ฐ์ ์ค์ด๊ธฐ ์ํด HashMap์ผ๋ก ๊ตฌํ์ผ๋ก ๋ฐ๊ฟ
- ์ต์ํ์ง ์์ HashMap ๋ฉ์๋ ์ฌ์ฉ
- put, get, containsKey๋ ์ต์ํจ
- HashMap ์ ์ฒด๋ฅผ ์กฐํํ๊ธฐ ์ํด hashmap.keySet()์ผ๋ก ํค๋ก ์กฐํํ๋ ๋ฐฉ์ ์ฌ์ฉ
- HashMap key๋ก ์ ๋ ฌ : TreeMap์ SortedMap ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค
- IDE ์์ด ๊ตฌํํ๋ ค๋ฉด ์ ๋ ฌ์ด๋ Iterator ๋ฑ ๋ฉ์๋ ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ์๊ฐ
- ์ฌ๋ฆผํจ์ ๋ฐ ํ๋ณํ
- ๋๋๊ธฐ ๊ฒฐ๊ณผ๋ก ์ค์๋ฅผ ์ป๊ธฐ ์ํด double๋ก ํ๋ณํ
- ์ฌ๋ฆผ ํจ์ ceil ํ, int๋ก ํ๋ณํ
- ๊ฐ์ ๋์์ ์ฌ๋ฌ ๋ฒ ์ํํ๋ฏ๋ก ํจ์ํํ๋ ค๊ณ ๋ ธ๋ ฅํจ
'Algorithm > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค - ๋ชจ์ ์ฌ์ (0) | 2023.07.25 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค - ์๊ฒฉ ์์คํ (0) | 2023.07.17 |
ํ๋ก๊ทธ๋๋จธ์ค - ๊ดํธ ํ์ ํ๊ธฐ (0) | 2022.06.22 |
ํ๋ก๊ทธ๋๋จธ์ค - ์์ ๋์งํ (0) | 2022.06.21 |
ํ๋ก๊ทธ๋๋จธ์ค - ์ผ๊ฐ ๋ฌํฝ์ด (0) | 2022.06.20 |