문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/92341
[이 문제는 프로그래머스에서 푼 문제입니다.]
이 문제는 문제에서 주어진 조건을 하나하나 구현해나가면 풀 수 있습니다. 우선 이 문제는 번호판이라는 것에서 착안하여 모든 차량의 종류가 0~9999 사이에 존재하는 것을 알 수 있습니다. 따라서 해당 배열의 인덱스로 번호판을 설정하고 들어올 때 시간을 체크하는 배열 하나, 총 시간을 체크하는 배열 하나 총 2개를 생성합니다. IN의 경우 들어올 떄 시간을 체크하는 배열에 저장하고, OUT의 경우 총 시간값을 최신화함과 동시에 들어올 때 시간값을 초기화합니다. 이 후 조건에 맞게 금액을 구하고, 나눌 때 나머지가 0이 아닐 경우 나눈 값에 1을 더해서 곱하는 방식으로 올림을 처리하면 되겠습니다.
다음은 코드입니다.
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
int[] inTime = new int[10000];
int[] totalTime = new int[10000];
Arrays.fill(inTime,-1);
for(int i=0;i<records.length;i++){
String str = records[i];
StringTokenizer st = new StringTokenizer(str);
String time = st.nextToken();
StringTokenizer stz = new StringTokenizer(time,":");
int h = Integer.parseInt(stz.nextToken());
int m = Integer.parseInt(stz.nextToken());
int t = h*60+m;
int id = Integer.parseInt(st.nextToken());
String status = st.nextToken();
if(status.equals("IN")) inTime[id] = t;
else if(status.equals("OUT")){
totalTime[id] += t - inTime[id];
inTime[id] = -1;
}
}
for(int i=0;i<10000;i++){
if(inTime[i]!=-1){
totalTime[i] += (23*60+59) - inTime[i];
}
}
ArrayList<Integer> val = new ArrayList<>();
for(int i=0;i<10000;i++){
if(totalTime[i]>0){
if(totalTime[i]<=fees[0]) val.add(fees[1]);
else{
if((totalTime[i]-fees[0])%fees[2]!=0)
val.add(fees[1] + (((totalTime[i]-fees[0])/fees[2])+1)*fees[3]);
else val.add(fees[1] + (totalTime[i]-fees[0])/fees[2]*fees[3]);
}
}
}
int[] answer = new int[val.size()];
int idx = 0;
for(int i=0;i<val.size();i++){
answer[idx] = val.get(i);
idx++;
}
return answer;
}
}