문제를 풀 때, 2개의 Map(HashMap, TreeMap)을 썼다.
parking(HashMap) : 변수명에서도 알 수 있듯이, 주차장과 같은 역할이다. 차량이 입차(IN)할 경우, 차량번호와 입차한 시간을 저장한다.
map(TreeMap) : 차량번호 별 총 주차시간을 저장할 것이다. TreeMap은 HashMap과 다르게 Key를 기준으로 오름차순이 되어 따로 정렬할 수고를 덜어준다.
이 2개의 Map을 사용한다면, 그저 문제에 나와 있는 대로 하면 된다. 입차할 때 기록(parking) 해놓고 출차할 타이밍에 시간을 계산하여 저장한다(map) 그렇게 누적된 시간을 다시 꺼내어 요금을 계산해주면 되는데 내가 오랜 시간 애먹었던 부분이 계산하는 부분으로
초과한 시간이 단위 시간으로 나누어 떨어지지 않으면 올림한다. 이 부분으로 올림을 잘못 계산해 문제를 여러 번 곱씹었다.
<문제>
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
<소스코드>
import java.util.*;
/*
총 주차시간을 누적하여 한꺼번에 요금을 계산해준다.
*/
class Solution {
static class Parking {
String intime;
String number;
public Parking(String intime, String number) {
this.intime = intime;
this.number = number;
}
}
static Map<String, Parking> parking;
static Map<String, Integer> map;
public int[] solution(int[] fees, String[] records) {
int[] answer;
parking = new HashMap<>();
map = new TreeMap<>();
for(int r = 0 ; r < records.length ; r++)
{
String[] arr = records[r].split(" ");
if(arr[2].equals("IN")) //입차할 경우
{
parking.put(arr[1], new Parking(arr[0], arr[1]));
}
else if(parking.containsKey(arr[1])) //arr[1]이 있을 경우(= 입차했다가 출차한 경우)
{
Parking p = parking.get(arr[1]);
int in = time_change(p.intime.split(":"));
int out = time_change(arr[0].split(":"));
int time = out - in;
//값이 있으면 get(number), 아니면 0
map.put(arr[1], map.getOrDefault(arr[1], 0) + time);
parking.remove(arr[1]);
}
}
for(String number : parking.keySet()) //입차만 하고 출차가 되지 않을 경우
{
Parking p = parking.get(number);
int in = time_change(p.intime.split(":"));
int time = (1439) - in;
//값이 있으면 get(number), 아니면 0
map.put(number, map.getOrDefault(number, 0) + time);
}
answer = new int[map.size()];
int index = 0;
for(String s : map.keySet()) {
int time = map.get(s);
int fee = fees[1];
if(time > fees[0]) //초과시간 분의 계산
{
int tmp = (time - fees[0]) / fees[2];
//나눠 떨어지지 않으면 올림
fee += Math.ceil((double)(time - fees[0]) / fees[2]) * fees[3];
}
answer[index++] = fee;
}
return answer;
}
public static int time_change(String[] arr) //시간을 분으로 전환하는 함수
{
return (Integer.parseInt(arr[0]) * 60 + Integer.parseInt(arr[1]));
}
}
'프로그래머스 > Level 2' 카테고리의 다른 글
프로그래머스 - n^2 배열 자르기(Python) (0) | 2025.05.05 |
---|---|
프로그래머스 - 귤 고르기(Python) (0) | 2025.05.04 |
프로그래머스 - 과제 진행하기(Python) (0) | 2025.05.04 |
프로그래머스(Lv.2) - k진수에서 소수 개수 구하기(Java) (1) | 2024.01.23 |
프로그래머스(Lv.2) - 피로도(Java) (완전탐색) (0) | 2023.10.29 |