728x90
⬛ 프로그래머스(카카오 기출) | LV.2 주차 요금 계산 - 단순 구현 문풀
https://school.programmers.co.kr/learn/courses/30/lessons/92341
💚문제 접근 방식
1) HashMap<String, Integer> 형태를 활용해서 입/출차 정보를 기록하려고 했다.
→ key로 식별할 차 번호는 String으로 담고,
→ value에는 차량 별 주차시간 (분) 이 담기도록 했다.
2) 데이터 기록 후, map의 value 값이 0보다 작거나 같은 케이스 처리
주의 사항에 보면, 입차 정보만 있고, 출차 정보가 없는 경우 23:59 에 출차했다고 처리하라는 말이 있다.
🎈내가 푼 방식에서는 입차 정보에 대해 time만큼 value를 빼주기 때문에
입차 정보는 있고 출차 정보가 없다면 반드시 time은 음수로 존재할 줄 알았다.
그런데, 출차 없이 time이 0인 경우도 있었다.
[00:00] 에 입차할 경우가 그렇다. (케이스 3번째에 해당)
3) List<Integer>에 차량번호 오름차순 정렬하여 ← 정렬된 key 로 접근해서 요금 계산해줌
문제에서 answer는 차량번호 오름차순이라고 되어 있고, HashMap 자체로는 key 정렬이 안되기 때문에 List를 활용해서 key만 정렬시키고, 순차적으로 key에 접근해서 정답을 세팅했다.
4) 요금 계산 및 정답 세팅
(1) 시간 ≤ 기본 요금 : 기본 요금만 세팅
(2) 시간 > 기본 요금 : 이 경우, 정확히 나눠 떨어지지 않으면 올림 하라는 말이 있다. 그래서 Math.ceil() 함수로 올렸다.
💚 제출 코드
import java.util.*;
class Solution {
//getTime
private static int getTime(String time){
int H = Integer.parseInt(time.split(":")[0]);
int M = Integer.parseInt(time.split(":")[1]);
return 60 * H + M;
}
//솔루션 함수
public List<Integer> solution(int[] fees, String[] records) {
//map <차량번호, 총 주차 시간>
HashMap<String, Integer> map = new HashMap<>();
for(String x : records){
String t = x.split(" ")[0];
String n = x.split(" ")[1];
String v = x.split(" ")[2];
int time = getTime(t);
if(map.containsKey(n)){ //이미 존재하는 차량인 경우
int val = map.get(n);
if(v.equals("IN")){
val -= time;
}else{//OUT
val += time;
}
map.put(n, val);
}else{//아닌 경우
if(v.equals("IN")){
map.put(n, -time);
}else { //OUT
map.put(n, time);
}
}
}
List<String> keySet = new ArrayList<>(map.keySet());
Collections.sort(keySet);
for(String key : keySet){
if(map.get(key) <= 0){
int val = map.get(key);
int time = getTime("23:59");
val += time;
map.put(key, val);
}
System.out.println(key + " " + map.get(key));
}
List<Integer> answer = new ArrayList<>();
for(String key : keySet){
int basic_time = fees[0];
int basic_price = fees[1];
int unit_time = fees[2];
int unit_price = fees[3];
//요금 = 기본 요금 + (시간-기본시간)/단위시간 * 단위 요금
if(map.get(key) != 0 &&map.get(key) <= basic_time){
answer.add(basic_price);
}else{
int totalParkingTime = map.get(key);
int excessTime = totalParkingTime - fees[0];
int fee = (((int)Math.ceil(((double)excessTime) / fees[2])) * fees[3]) + fees[1];
answer.add(fee);
}
}
return answer;
}
}
💚 회고
이 문제의 경우는 알고리즘이 특별히 있다기 보다는, 문제가 요구하는 흐름대로 따라가서 구현을 잘 하면 되는 문제이다.
주의 사항을 잘 읽어야 하고, 논리적으로 처리해야 할 부분을 쪼개서 처리해야 한다.
728x90
'코딩 테스트 [준비] > [문풀] 프로그래머스_문풀_조지기' 카테고리의 다른 글
프로그래머스 | LV.2 우박수열 정적분 - 단순 구현 문풀 (Java) (16) | 2024.02.25 |
---|---|
프로그래머스 | LV.1 달리기 경주 - HashMap 단순 구현 문풀 (Java) (14) | 2024.02.25 |
프로그래머스(카카오 기출) | LV.3 합승 택시 요금 - 플로이드 or 다익스트라 문풀 (Java) (64) | 2024.02.17 |
프로그래머스 (Dev-Matching 기출) | LV.2 행렬 테두리 회전하기 - 구현 (59) | 2024.02.17 |
프로그래머스 (카카오 기출) | LV.2 문자열 압축 - 문자열 활용 구현 문풀 (Java) (59) | 2024.02.17 |