[2022 KAKAO BLIND RECRUITMENT] 주차 요금 계산

최민길(Gale)·2023년 3월 22일
1

알고리즘

목록 보기
55/172

문제 링크 : 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;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글