2022 KAKAO BLIND RECRUITMENT 주차 요금 계산

soluinoon·2022년 10월 13일
0

알고리즘 저지

목록 보기
3/13
post-custom-banner

1. 문제정보

1.1 링크

문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/92341

1.2 문제요약

IN, OUT 짝으로 찾아서 시간계산하고 더해주는 문제

2. 문제풀이

2.1 접근법

2.1.1 시간은 무조건 정수로

// input ex) 59:59
public int timeToMin(String time) {
        
        int res = 0;
        
        StringTokenizer st = new StringTokenizer(time, ":");
        int hour = Integer.parseInt(st.nextToken());
        int min = Integer.parseInt(st.nextToken());
        
        res = hour * 60 + min;
        
        return res;
    }

시간 계산하는 문제는 무조건 시간을 정수로 바꾸는게 편하다.
ex) 59:59:01 -> 59x3600 + 59x60 + 1

2.1.2 짝구하기

public int getTime(int index,int min, int car, String[] records) {
        
        int res = 0;
        
        for (int i = index; i < records.length; i++) {
            StringTokenizer st = new StringTokenizer(records[i]);
            int temp_min = timeToMin(st.nextToken());
            int temp_car = Integer.parseInt(st.nextToken());
            if (temp_car == car && st.nextToken().equals("OUT")) {
                return temp_min - min;
            }
        }
        return timeToMin("23:59") - min;
    }

IN, OUT 한 짝을 구하는게 메인인데 반복문을 돌다가 IN을 발견하면, 인덱스를 들고 메서드를 호출해서 가장 빠르게 오는 OUT을 찾아 시간을 구하도록 구현했다.

2.1.3 값 저장

해쉬맵을 하나 만들어서 차번호마다 갱신하도록 했다.

2.1.4 소수점 올림

public int getFee(int min, int[] fee) {
        
        if (min <= fee[0]) {
            return fee[1];
        }
        double temp = (double)(min - fee[0]) / (double)fee[2];
        double additional_time = Math.ceil(temp);
        return (int)(additional_time * fee[3] + fee[1]);
    }
}

그리고 복병이 소수점 올림 하는 부분인데, 여기서 정말 시간을 많이 뺏겼다.처음에 그냥 바로 Math라이브러리를 사용했지만, 계속 실패했다. 사실 간단한 실수였는데, 애초에 int상태로 나누기를 진행해서 값이 계속 정수로 넘어갔었다.
소수점을 뽑으려면 무조건 double로 캐스팅하고 나눗셈을 진행하자.

2.2 전체코드

// 10:37 시작
// 11:35
import java.io.*;
import java.util.*;
import java.lang.*;

class Solution {
    
    public int[] solution(int[] fees, String[] records) {
        
        int[] answer = {};
        HashMap<Integer, Integer> map = new HashMap<>();
        
        for (int i = 0; i < records.length; i++) {
            StringTokenizer st = new StringTokenizer(records[i]);
            int min = timeToMin(st.nextToken());
            int car = Integer.parseInt(st.nextToken());
            
            if (st.nextToken().equals("IN")) {
                int time = getTime(i, min, car, records);
                if (map.get(car) == null) {
                    map.put(car, time);
                } else {
                    map.put(car, map.get(car) + time);
                }
            }
        }
        answer = new int[map.keySet().size()];
        int index = 0;
        for(int i: map.keySet()) {
            answer[index] = i;
            index++;
        }
        Arrays.sort(answer);
        for (int i = 0; i < answer.length; i++) {
            answer[i] = getFee(map.get(answer[i]), fees);
        }
        return answer;
    }
    
    public int timeToMin(String time) {
        
        int res = 0;
        
        StringTokenizer st = new StringTokenizer(time, ":");
        int hour = Integer.parseInt(st.nextToken());
        int min = Integer.parseInt(st.nextToken());
        
        res = hour * 60 + min;
        
        return res;
    }
    
    public int getTime(int index,int min, int car, String[] records) {
        
        int res = 0;
        
        for (int i = index; i < records.length; i++) {
            StringTokenizer st = new StringTokenizer(records[i]);
            int temp_min = timeToMin(st.nextToken());
            int temp_car = Integer.parseInt(st.nextToken());
            if (temp_car == car && st.nextToken().equals("OUT")) {
                return temp_min - min;
            }
        }
        return timeToMin("23:59") - min;
    }
    
    /*
    fee[0] = 기본시간
    fee[1] = 기본요금
    fee[2] = 추가시간당
    fee[3] = 추가요금
    */
    public int getFee(int min, int[] fee) {
        
        if (min <= fee[0]) {
            return fee[1];
        }
        double temp = (double)(min - fee[0]) / (double)fee[2];
        double additional_time = Math.ceil(temp);
        return (int)(additional_time * fee[3] + fee[1]);
    }
}

3. 결론

아직 라이브러리 쓰면서 햇갈리는게 많다. 계속 쓰면서 익숙해지자.

profile
수박개 입니다.
post-custom-banner

0개의 댓글