반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
입출력
이 문제는 2022 카카오 블라인드 채용에 나온 문제인데 단순 구현 문제임에도 불구하고 아직 실력이 많이 부족해 시간이 좀 오래걸렸던 문제이다.. ㅠㅠ
문제 자체가 어렵지는 않았지만 시간이 조금 오래 걸렸다는 점에서 아직 연습이 많이 부족함을 느꼈다.
더 좋은 방법이 있다면 공유 부탁드립니다.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
class Solution {
static final String IN = "IN";
static final String OUT = "OUT";
static final String lastTime = "23:59";
static final int HOUR = 24;
static final int MINUTE = 60;
static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
public static void main(String[] args) throws ParseException {
int[] fees = {180, 5000, 10, 600};
String[] records = {"05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"};
System.out.println(Arrays.toString(solution(fees, records)));
}
static public int[] solution(int[] fees, String[] records) throws ParseException {
int[] answer;
int baseTime = fees[0];
int baseFee = fees[1];
int unitTime = fees[2];
int unitFee = fees[3];
LinkedHashMap<String, String> carRecordsMap = new LinkedHashMap<>();
HashMap<String, Integer> carTimeMap = new HashMap<>();
for (String record : records) {
StringTokenizer st = new StringTokenizer(record);
String inTime = st.nextToken();
String carNumber = st.nextToken();
String inOut = st.nextToken();
if (inOut.equals(IN)) {
carRecordsMap.put(carNumber, inTime);
} else {
int minute = getTimeMinute(carRecordsMap.get(carNumber), inTime);
if (carTimeMap.containsKey(carNumber)) {
carTimeMap.put(carNumber, minute + carTimeMap.get(carNumber));
} else {
carTimeMap.put(carNumber, minute);
}
carRecordsMap.remove(carNumber);
}
}
// OUT 이 없는 차 추출
for (String key : carRecordsMap.keySet()) {
int minute = getTimeMinute(carRecordsMap.get(key), lastTime);
if (carTimeMap.containsKey(key)) {
carTimeMap.put(key, minute + carTimeMap.get(key));
} else {
carTimeMap.put(key, minute);
}
}
// 자동차의 번호를 오름차순으로 정렬
ArrayList<String> keySet = new ArrayList<>(carTimeMap.keySet());
Collections.sort(keySet);
int[] sortedCarArr = new int[keySet.size()];
for (int i = 0; i < keySet.size(); i++) {
sortedCarArr[i] = carTimeMap.get(keySet.get(i));
}
ArrayList<Integer> resultArrayList = new ArrayList<>();
// 정렬된 자동차 번호 순서로 각 자동차들의 주차요금을 계산
for (int x : sortedCarArr) {
int totalMinute = x;
int X; // 몫
boolean check = false; // 10분단위로 떨어지는지 확인하여 안떨어지면 올림 처리 (단위 금액 한번 추가)
if (totalMinute <= baseTime) {
resultArrayList.add(baseFee);
continue;
} else {
totalMinute = totalMinute - baseTime;
if (totalMinute % unitTime != 0) {
check = true;
}
X = totalMinute / unitTime;
}
int result = baseFee + (X * unitFee);
if (check) result = result + unitFee;
resultArrayList.add(result);
}
answer = new int[resultArrayList.size()];
for (int i = 0; i < answer.length; i++){
answer[i] = resultArrayList.get(i);
}
return answer;
}
static public int getTimeMinute(String time, String afterTime) throws ParseException {
Date date1 = sdf.parse(time);
Date date2 = sdf.parse(afterTime);
long timeMil1 = date1.getTime();
long timeMil2 = date2.getTime();
long diff = timeMil2 - timeMil1;
return Long.valueOf(diff / (1000 * 60)).intValue();
}
}
느낀점
단순한 구현문제인데 푸는 방식이 너무 원초적인게 아닌가 생각이 드는 문제이다. 더 빠르고 쉽게 푸는 방법은 없는지 알아 봐야할 것 같고, 아직 연습이 많이 부족하기에 더 열심히 노력해야겠다.
반응형
'코딩테스트(Java) > 프로그래머스 2단계' 카테고리의 다른 글
[프로그래머스] 최솟값 만들기 - JAVA (0) | 2024.02.28 |
---|---|
[프로그래머스] JadenCase 문자열 만들기 - JAVA (0) | 2024.02.28 |