본문 바로가기
CodingTest/Programmers

[Programmers] 주차 요금 계산 (카카오 2022 공채)

by 창브로 2025. 9. 10.

[문제 링크]

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

[코드]

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        // 기본 시간, 요금, 단위 시간, 단위 요금
        int basicTime = fees[0];
        int basicCharge = fees[1];
        int partTime = fees[2];
        int partCharge = fees[3];

        // 차량 입차 시간 기록
        Map<String, String> carInMap = new HashMap<>();
        // 차량별 누적 시간
        Map<String, Integer> carTimeMap = new HashMap<>();

        for (String record : records) {
            String[] split = record.split(" ");
            String time = split[0];
            String carNumber = split[1];
            String inOrOut = split[2];

            if (inOrOut.equals("IN")) {
                carInMap.put(carNumber, time);
            } else { // OUT
                String inTime = carInMap.remove(carNumber);
                int minutes = getTotalMinute(inTime, time);
                carTimeMap.put(carNumber, carTimeMap.getOrDefault(carNumber, 0) + minutes);
            }
        }

        // 출차 기록 없는 차량 처리 (23:59 기준)
        for (String carNumber : carInMap.keySet()) {
            String inTime = carInMap.get(carNumber);
            int minutes = getTotalMinute(inTime, "23:59");
            carTimeMap.put(carNumber, carTimeMap.getOrDefault(carNumber, 0) + minutes);
        }

        // 차량 번호 정렬
        List<String> carNumbers = new ArrayList<>(carTimeMap.keySet());
        Collections.sort(carNumbers);

        // 최종 요금 계산
        int[] answer = new int[carNumbers.size()];
        for (int i = 0; i < carNumbers.size(); i++) {
            int totalTime = carTimeMap.get(carNumbers.get(i));
            answer[i] = getTotalCharge(totalTime, basicTime, basicCharge, partTime, partCharge);
        }

        return answer;
    }

    // "HH:MM" 형식 문자열을 분 단위로 변환 후 차이 계산
    private int getTotalMinute(String in, String out) {
        String[] inArr = in.split(":");
        String[] outArr = out.split(":");
        int inHour = Integer.parseInt(inArr[0]);
        int inMinute = Integer.parseInt(inArr[1]);
        int outHour = Integer.parseInt(outArr[0]);
        int outMinute = Integer.parseInt(outArr[1]);

        return (outHour * 60 + outMinute) - (inHour * 60 + inMinute);
    }

    // 최종 요금 계산
    private int getTotalCharge(int totalTime, int basicTime, int basicCharge, int partTime, int partCharge) {
        if (totalTime <= basicTime) return basicCharge;

        int extraTime = totalTime - basicTime;
        int extraCharge = 0;
        
        if(extraTime % partTime  == 0) {
            extraCharge += (extraTime / partTime) * partCharge;
        } else {
            extraCharge += ((extraTime / partTime) + 1) * partCharge;
        }

        return basicCharge + extraCharge;
    }
}

[회고]

풀이 과정은 쉬웠지만 생각보다 구현하는데 많은 시간이 걸렸고 좀 헷갈렸습니다.

쉬운 카카오 공채 문제였지만 그래도 해결해서 좋습니다.

 

 

 

 

질문과 피드백은 언제나 환영입니다.

감사합니다.