Step-by-Step
[Java] 프로그래머스 - 주차 요금 계산 본문
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
일상에서 볼 수 있는 유료주차장의 계산 방식 똑같이 적용하면 된다.
단, 나갔다 다시 들어와도 기본요금을 적용하지 않고, 시간 누적 후 한 번에 정산하는 방식으로 진행된다.
시간 단위는 모두 분으로 바꿈
※ 문제 풀이에 사용된 필드
1. 주차장에 들어온 모든 차량 저장(중복X) : ArrayList - cars
2. 현재 들어온 후 나가지 않은 차량 : HashMap - parking (차번호, 들어온시간)
3. 각 차량별 누적 주차 시간 : HashMap - totTime (차번호, 누적시간)
문제 풀이 방식은 다음과 같다.
1. 들어오면(IN)
- 신규차량에 관계없이 parking에 추가
- 신규차량이면 cars에 번호 추가 + totTime에 (차번호, 0분)으로 추가
2. 나가면(OUT)
- 시간 계산 후 totTime에 누적시간 갱신
- parking에서 삭제
3. records 기록을 다 읽고, 남은 차량 정산
- parking에 있는 기록들 다 읽어옴 (들어오고 나가지 않은 차들)
- "23:59 차번호 OUT"으로 문자열 생성후, 누적 시간계산
4. 시간 계산
- Collection 이용해서 cars 번호순으로 정렬
- 각 번호의 totTime 정보 읽어와서 요금 계산
- int[] res에 담아서 리턴
import java.util.*;
class Solution {
HashMap<String,String> parking = new HashMap<>();
HashMap<String,Integer> totTime = new HashMap<>();
public int[] solution(int[] fees, String[] records) {
// 들어왔다 나간 모든 차
ArrayList<String> cars = new ArrayList<String>();
for(int i=0; i<records.length; i++) {
String[] str = records[i].split(" ");
// 들어온 차
if(str[2].equals("IN")) {
parking.put(str[1], str[0]);
// 처음 들어온 차
if(!cars.contains(str[1])) {
totTime.put(str[1], 0);
cars.add(str[1]);
}
}
// 나간 차
else {
int time = calTime(records[i]);
parking.remove(str[1]);
totTime.put(str[1], totTime.get(str[1])+time);
}
}
for(Map.Entry<String, String> e : parking.entrySet()) {
int time = calTime("23:59 "+ e.getKey()+" OUT");
totTime.put(e.getKey(), totTime.get(e.getKey())+time);
}
Collections.sort(cars);
System.out.println(cars);
int[] res = new int[cars.size()];
for(int i = 0; i<cars.size(); i++) {
res[i] = calFee(fees,totTime.get(cars.get(i)));
}
return res;
}
public int calTime(String outRecord) {
String[] str = outRecord.split(" ");
String in = parking.get(str[1]);
String out = str[0];
int hour = Integer.parseInt(out.substring(0,2))-Integer.parseInt(in.substring(0,2));
int min = Integer.parseInt(out.substring(3))-Integer.parseInt(in.substring(3));
return hour * 60 + min;
}
public int calFee(int[] fees, int time) {
time -= fees[0];
if(time <= 0)
return fees[1];
return fees[1] + (int)(Math.ceil((double)time/fees[2]) * fees[3]);
}
}
※ 주의!!!
for(Map.Entry<String, String> e : parking.entrySet()) {
int time = calTime("23:59 "+ e.getKey()+" OUT");
totTime.put(e.getKey(), totTime.get(e.getKey())+time);
parking.remove(e.getKey());
}
- 출차기록이 없는 차들 조회할때 parking.remove(e.getKey()); 삭제 코드를 넣으면 런타임 에러 발생한다
- Key를 사용하고 있는데, 삭제해서 그런듯. 없애도 정상 출력이 가능하지 넣지 마세요!
'언어 > JAVA' 카테고리의 다른 글
[Java] 백준14888 - 연산자 끼워넣기 (0) | 2022.10.19 |
---|---|
[Java] 백준1926 - 그림 (1) | 2022.09.23 |
[Java] 프로그래머스 - k진수에서 소수 개수 구하기 (0) | 2022.09.22 |
[Java] 소수 판별 메소드 (1) | 2022.09.22 |
[Java] 백준 17780 - 새로운 게임 (0) | 2022.07.05 |