본문 바로가기
알고리즘

[프로그래머스/JAVA] 주차 요금 계산

by 상후 2022. 10. 9.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 방법
1. 출입기록을 책임지는 클래스 설계
2. Map을 Key를 활용하여 여러 번 출입하는 기록 제어

 

내 코드(JAVA)

 

class Bill {
    private List<LocalTime> inTimeList = new ArrayList<>();
    private List<LocalTime> outTimeList = new ArrayList<>();
    private double price;
    private final double DEFAULT_MINUTE;
    private final double DEFAULT_PRICE;
    private final double UNIT_MINUTE;
    private final double UNIT_PRICE;

    public Bill(String record, int[] fees) {
        DEFAULT_MINUTE = fees[0];
        DEFAULT_PRICE = fees[1];
        UNIT_MINUTE = fees[2];
        UNIT_PRICE = fees[3];

        addAccessRecords(record);
    }

    public void addAccessRecords(String record) { // 기록 저장
        String[] info = record.split(" ");
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("H:mm");
        String recordTime = info[0];

        if ("IN".equals(info[2])) {
            inTimeList.add(LocalTime.parse(recordTime, dateTimeFormatter));
        } else {
            outTimeList.add(LocalTime.parse(recordTime, dateTimeFormatter));
        }
    }

    public void calcPrice(int[] fees) { // 요금 계산
        int totalMinute = 0;

        for (int i = 0; i < inTimeList.size(); i++) {
            LocalTime inTime = inTimeList.get(i);
            LocalTime outTime;

            try {
                outTime = outTimeList.get(i);
            } catch (IndexOutOfBoundsException e) {
                outTime = LocalTime.of(23, 59);
            }

            totalMinute += Duration.between(inTime, outTime).getSeconds() / 60;
        }

        price = totalMinute > DEFAULT_MINUTE ? DEFAULT_PRICE + Math.ceil((totalMinute - DEFAULT_MINUTE) / UNIT_MINUTE) * UNIT_PRICE : DEFAULT_PRICE;
    }

    public double getPrice() {
        return price;
    }
}

 

public int[] solution(int[] fees, String[] records) {
    int[] answer = {};
    HashMap<String, Bill> billsMap = new HashMap<>();

    for (String record : records) { // 기록 저장
        String[] info = record.split(" ");
        String carNumber = info[1];

        Bill bill = billsMap.get(carNumber);
        if (bill == null) {
            billsMap.put(carNumber, new Bill(record, fees));
        } else {
            bill.addAccessRecords(record);
        }
    }

    for (Bill bill : billsMap.values()) { // 요금 계산
        bill.calcPrice(fees);
    }

    // 차 번호로 정렬 후 결과 세팅
    ArrayList<String> keySet = new ArrayList<>(billsMap.keySet());
    answer = new int[keySet.size()];

    Collections.sort(keySet);
    for (int i = 0; i < keySet.size(); i++) {
        answer[i] = (int) billsMap.get(keySet.get(i)).getPrice();
    }

    return answer;
}

 

 

728x90
반응형

댓글