https://programmers.co.kr/learn/courses/30/lessons/92341?language=java
코딩테스트 연습 - 주차 요금 계산
[180, 5000, 10, 600] ["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]
programmers.co.kr
이 문제는 2022년 카카오 공채에 나온 문제라고 한다. TreeMap이라는 자료구조를 처음 사용해봤는데 문제에 따라서 굉장히 유용하게 사용할 수 있을 것 같다. 문제는 아래의 처리과정을 통해 풀었다.
1. 사용할 HashMap, TreeMap, 변수 및 시간 차/요금계산용 static 메소드 구현
2. records의 값에 따라 입차/출차될 때를 나눠서 임시변수 HashMap에 저장
1-1. 입차될 때에는 무조건 key-value(차 번호, 입차시간) 쌍을 저장
1-2. 출차될 때에는 기존의 차 번호 key값을 기준으로 입차시간을 가져오기
1-2-1. HashMap에서 입차시간을 가지고 있는 값을 제거
1-2-2. 처음 출차되는 차는 출차시간-입차시간 결과를 그대로 결과값 TreeMap에 key-value(차 번호, 주차시간) 쌍으로 저장
1-2-3. 이미 출차된 차는 TreeMap에 값이 있으므로, 기존의 주차시간 value + 출차될 때 계산된 새로운 주차시간을 더해서 key-value(차 번호, 주차시간) 쌍으로 저장
3. 출차가 안된 차량이 있을 경우에 예외처리
2-1. HashMap에 값이 남아있는 경우 아직 출차가 안된 차이기 때문에 23시 59분을 기준으로 시간과 요금 계산
2-2. 이 때, 윗 단계에서 출차가 안된 차일 경우에는 새롭게 TreeMap에 저장하고, 아닐 경우에는 기존의 value값과 더해서 key-value(차 번호, 주차시간) 쌍으로 저장
4. TreeMap 구조를 사용했기 때문에 key인 차량번호 기준으로 자동 오름차순이 되어있기 때문에 결과변수 int 배열에 result의 value값들을 저장한 후 리턴
문제
제한사항
입출력 예시
코드
import java.util.HashMap;
import java.util.TreeMap;
class Solution
{
public static int calcCharge(int minute, int[] fees)
{
double result = 0;
if(minute<fees[0])
{
return fees[1];
}
result = Math.ceil((double)(minute-fees[0])/fees[2]);
return (int) (result*fees[3]) + fees[1];
}
public static int calcTime(int beforeH, int beforeM, int afterH, int afterM)
{
int hour = afterH-beforeH;
int minute = (afterM-beforeM) + 60;
if(minute<60)
{
hour--;
}
else
{
minute -= 60;
}
return (hour*60) + minute;
}
public static int[] solution(int[] fees, String[] records)
{
HashMap<String, String> map = new HashMap<String, String>(); // key(car), value(in time)
TreeMap<String, Integer> result = new TreeMap<String, Integer>(); // key(car), value(minute)
int calcTime = 0;
for(int i=0; i<records.length; i++)
{
String[] input = records[i].split(" ");
if(input[2].equals("IN")) // 입차될 때
{
map.put(input[1], input[0]);
}
else // 출차될 때
{
String[] before = map.get(input[1]).split(":");
String[] after = input[0].split(":");
calcTime = calcTime(Integer.parseInt(before[0]), Integer.parseInt(before[1]), Integer.parseInt(after[0]), Integer.parseInt(after[1]));
map.remove(input[1]);
if(result.containsKey(input[1])) // 기존에 이미 출차된 차일때
{
result.put(input[1], result.get(input[1])+calcTime);
}
else // 처음 출차될 때
{
result.put(input[1], calcTime);
}
}
}
// 출차가 안된 차량이 있을 경우 나머지 계산처리
Object[] last = map.entrySet().toArray(new Object[0]);
for(int i=0; i<last.length; i++)
{
String[] temp = last[i].toString().split("=");
String[] time = temp[1].split(":");
calcTime = calcTime(Integer.parseInt(time[0]), Integer.parseInt(time[1]), 23, 59);
// 이미 결과 Map에 들어가있을 경우
if(result.containsKey(temp[0]))
{
result.put(temp[0], result.get(temp[0]) + calcTime);
}
// 차량이 결과 Map에 안들어가 있고, 출차되지 않을 경우(예외처리)
else
{
result.put(temp[0], calcTime);
}
}
Integer[] time = result.values().toArray(new Integer[0]);
int[] answer = new int[time.length];
for(int i=0; i<time.length; i++)
{
answer[i] = calcCharge(time[i], fees);
}
return answer;
}
}
'[ 다먹살 ] > - Coding' 카테고리의 다른 글
[백준] 14494 다이나믹이 뭐예요? (0) | 2022.04.05 |
---|---|
[백준] 17413 단어 뒤집기2 (0) | 2022.04.04 |
[프로그래머스] 레벨1 신고 결과 받기 (0) | 2022.04.02 |
[백준] 1531 투명 (0) | 2022.03.31 |
[백준] 11441 합 구하기 (0) | 2022.03.29 |
댓글