반응형
https://programmers.co.kr/learn/courses/30/lessons/92341
생각한 방식
차 번호를 기반으로 조회하므로 자료구조는 맵으로 선택했다.
가장 작은 번호순으로 answer배열에 값을 넣고 출력해야 한다. records를 한 번 순회해야 차번호를 정렬할 수 있으므로 list에 차 번호를 넣어서 이 값을 인덱스로 활용했다.
분 배열을 만들어서 list에서 구한 인덱스에 분 값을 다 넣고 price배열에 가격을 계산한 값을 넣었다.
잘 한 부분
map을 고른 것과 list를 인덱스로 활용했다.
부족한 부분
문제를 잘못 이해해서 minutes배열을 구하지 않았었다.
다른 코드를 참고하니 시간을 먼저 계산해서 넣었다. 미리 계산하면 for문을 한 번 줄일 수 있다.
또한 TreeMap에 차 번호를 넣고 index변수를 선언해서 순회하면 굳이 list를 새로 생성할 필요 없이 index를 조회할 수 있다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static void main(String[] args){
int[] n = {180, 5000, 10, 600};
String[] n2 = {"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"};
//System.out.println(solution(4578, n));
System.out.println(solution(n, n2));
}
public static int[] solution(int[] fees, String[] records){
int[] answer;
Map<String, String> map = new HashMap<String, String>();
ArrayList<String> list = new ArrayList<>();
for (String record : records) {
String[] item = record.split(" ");
if(!list.contains(item[1])) list.add(item[1]);
}
Collections.sort(list);
answer = new int[list.size()];
int[] minutes = new int[list.size()];
for (String record : records) {
String[] item = record.split(" ");
if(item[2].equals("IN")) {
map.put(item[1], item[0]);
}else {
String[] inTimes = map.remove(item[1]).split(":");
String[] outTimes = item[0].split(":");
//분으로 변경
int inTimeHour = Integer.parseInt(inTimes[0]) * 60;
int outTimeHour = Integer.parseInt(outTimes[0]) * 60;
//차를 구하고 요금을 계산함
int minute = (outTimeHour + Integer.parseInt(outTimes[1])) - (inTimeHour + Integer.parseInt(inTimes[1]));
minutes[list.indexOf(item[1])] += minute;
}
}
for (String carNum : map.keySet()) {
//남아있는 차 번호
int lastTime = 1439;
String[] inTimes = map.get(carNum).split(":");
int inTime = Integer.parseInt(inTimes[0]) * 60 + Integer.parseInt(inTimes[1]);
minutes[list.indexOf(carNum)] += lastTime - inTime;
}
for (int i = 0; i < minutes.length; i++) {
int price = 0;
if(minutes[i] <= fees[0]) price = fees[1];
else {
price = fees[1] + ((int)Math.ceil((double)(minutes[i] - fees[0]) / fees[2]) * fees[3]);
}
answer[i] = price;
}
return answer;
}
}
반응형
'알고리즘' 카테고리의 다른 글
백준 2580 스도쿠 자바 (0) | 2022.03.19 |
---|---|
백준 9663 N-Queen 자바 (0) | 2022.03.17 |
백준 2470 자바 드래곤 커브 (0) | 2022.03.09 |
백준 18870 자바 (0) | 2022.03.09 |
백준 2108 자바 (0) | 2022.03.08 |