❓ 문제 - 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 - JAVA 풀이법
출처
(https://programmers.co.kr/learn/courses/30/lessons/92341)
📝 문제해결법
1. HashMap + 구현을 통해 문제를 해결하였다.
- inout이라는 HashMap을 통해 Key(차넘버), Value(Park객체 -> time(총 주차한 시간), in_time(차가 주차장에 들어온 시간), isOut(차가 혹시 주차장을 나갔는지체크))로 관리한다.
- car라는 ArrayList로 차넘버에 대한 정보를 넣고 나중에 answer에 차번호를 오름차순으로 주차비용을 넣기위해 활용한다.
- str_to_time()이라는 메서드를 통해 hh:mm 상태를 -> 분단위로 바꿔준다.
- 주차장에 기록을 차례대로 만약 해당 차가 들어온 상태(IN)일 때 만약 처음 들어오는 차인지 아닌지 hashMap에 해당 차번호로 키값이 존재하는지 여부를 체크한다.
- 처음으로 들어온 차라면 hashMap에 해당 차번호로 생성 및 car에 차번호를 넣어준다.
- 차가 주차장에 들어옴 처리를 위해 isOut(차가 주차장을 나갔는지 체크)를 false로 변경해주고 차가 들어온 시간을 Park 객체에 변경해준다.
- 만약 차가 나가는 상태(OUT)이라면 차가 들어온 시간 in_time과 나간 시간 out_time을 빼서 기존 hashMap time(누적 주차 시간)에 더해준다.
- car라는 리스트를 정렬하면 오름차순으로 차의 번호대로 누적 주차 시간마다 cal_money 함수를 호출하여서 주차 요금을 계산한다.
- cal_money() 함수에는 문제에서 주어진 그대로 누적 주차 시간(time)이 기본시간 이하라면 기본요금으로, 누적 주차시간이 기본시간 초과라면 단위시간마다 단위요금을 곱해주고 기본요금을 더해서 주차요금을 리턴한다.
2. 느낀점
- 이 문제 코드는 정말 맘에 들지 않는다.. 그래도 두 차례정도 코드를 손봤는데 다른 사람들이 푼 코드를 보면 조금 더 간결하게 푸셨다.. 부럽..
- 처음에 문제를 체계적으로 설계한 상태에서 프로그래머스에 웹상에서 바로 코딩해서 시간이 많이 걸렸다.. 다음부터 문제를 제대로 읽고 체계적으로 설계하고 한번 테스트 케이스로 검증후에 코드를 작성해야하겠다!
- 일단 이 문제를 푸면서 느낀 점은 ArrayList를 정렬할 때 Collections.sort를 활용하는데 이 때 String 형태는 정렬을 위해 다른 처리를 해줘야하는줄 알았는데 숫자형 String이라면 숫자처럼 정렬을 해준다는 사실이다!
- 조금은 객체지향스럽게 코드를 작성해봤는데 이게 과연 코테에서도 좋은 코드인지는 아직까지 의문이다.. 아시는 분 있다면 댓글주세요...ㅎㅎ
💻 소스코드
// 2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산
// HashMap + 구현
import java.util.*;
class Solution {
public static class Park {
int time = 0;
int in_time = -1;
boolean isOut = false;
}
public int[] solution(int[] fees, String[] records) {
ArrayList<String> car = new ArrayList<String>();
HashMap<String, Park> inout = new HashMap<String, Park>();
for(int i=0;i<records.length;i++){
String[] str = records[i].split(" ");
if(str[2].equals("IN")){
Park park;
int time = str_to_time(str[0]);
if(inout.containsKey(str[1])){
park = inout.get(str[1]);
} else {
car.add(str[1]);
park = new Park();
}
park.in_time = time;
park.isOut = false;
inout.put(str[1], park);
} else {
int out_time = str_to_time(str[0]);
Park park = inout.get(str[1]);
int diff = out_time - park.in_time;
park.time += diff;
park.isOut = true;
}
}
int[] answer = new int[car.size()];
Collections.sort(car);
for(int i=0;i<car.size();i++){
String car_num = car.get(i);
if(inout.get(car_num).isOut){
answer[i] = cal_money(inout.get(car_num).time, fees);
} else {
int in_time = inout.get(car_num).in_time;
int out_time = str_to_time("23:59");
answer[i] = cal_money(inout.get(car_num).time + out_time-in_time, fees);
}
System.out.println(answer[i]);
}
return answer;
}
public static int cal_money(int diff, int[] fees){
int money = 0;
if(diff > fees[0]){
int diff_default = diff - fees[0];
if(diff_default % fees[2] == 0){
return fees[1] + (diff_default / fees[2]) * fees[3];
} else {
return fees[1] + ((diff_default / fees[2])+1) * fees[3];
}
} else {
return fees[1];
}
}
public static int str_to_time(String t){
String[] str = t.split(":");
return Integer.parseInt(str[0]) * 60 + Integer.parseInt(str[1]);
}
}
'알고리즘 > 알고리즘문풀' 카테고리의 다른 글
2022 KAKAO BLIND RECRUITMENT - 양과 늑대 (JAVA) (0) | 2022.06.21 |
---|---|
2022 KAKAO BLIND RECRUITMENT - 양궁대회 (JAVA) (0) | 2022.06.15 |
2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (JAVA) (0) | 2022.06.12 |
2021 KAKAO BLIND RECRUITMENT - 매출 하락 최소화 (JAVA) (0) | 2022.06.09 |
BOJ - 트리의 지름 1167번 (JAVA) (0) | 2022.06.08 |