[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개의 댓글

관련 채용 정보