프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제설명 생략
문제풀이
먼저 records[ ] 에서 차번호만 Arraylist 1에 담아 차번호순으로 정렬을 해놓는다. 그리고 HashMap<String, ArrayList<String>> 에 records[ ] 의 차번호를 key값, 출입시간을 value( Arraylist ) 에 담는다. 이 때 IN , OUT는 신경쓰지 않는다. HashMap<String, ArrayList<String>> 의 ArrayList에 짝수인덱스 ( arr[0] , arr[2] ... )은 입차시간 기록이고
ArrayList에 홀수인덱스( arr[1] , arr[3] ... ) 은 출차시간 기록이다.
그 후 정렬된 Arraylist 1 을 이용하여 HashMap를 조회하여 출입기록을 계산한다.
이 때 출입기록의 ArrayList 의 크기가 짝수면 차량이 마지막에 출차를 하여 주차장에 없는 상태이고, 홀수이면 마지막에 입차를 하여 주차장에 있는 상태이므로 짝수인 경우와 홀수인경우를 나눠서 코드를 구성했다. ( IN -> OUT -> IN -> OUT 형식이기 때문 )
요금의 계산은 OUT 에서 IN 을 뺀 시간(분 단위)을 모두 구하고 기본시간을 초과했을 경우 단위시간과 단위요금을 고려하여 계산을 한다.


구현코드
import java.util.*;
class Solution {
public ArrayList<Integer> solution(int[] fees, String[] records) {
HashMap<String, ArrayList<String>> hm = new HashMap<>();
ArrayList<String> arrsort = new ArrayList<>(); // 번호판 정렬을 위한 list
ArrayList<Integer> answer = new ArrayList<>();
for (int i = 0; i < records.length; i++) {
if (hm.get(records[i].split(" ")[1]) == null) {
hm.put(records[i].split(" ")[1], new ArrayList<>());
}
hm.get(records[i].split(" ")[1]).add(records[i].split(" ")[0]);
}
for (String s : hm.keySet()) { // 번호판 정렬과정
arrsort.add(s);
}
Collections.sort(arrsort); // 번호판 정렬과정
for (String s : arrsort) {
int hour = 0;
int minute = 0;
int sum = 0;
if (hm.get(s).size() % 2 == 0) {
for (int i = 0; i < hm.get(s).size(); i += 2) {
hour += Integer.parseInt(hm.get(s).get(i + 1).split(":")[0])
- Integer.parseInt(hm.get(s).get(i).split(":")[0]);
minute += Integer.parseInt(hm.get(s).get(i + 1).split(":")[1])
- Integer.parseInt(hm.get(s).get(i).split(":")[1]);
}
} else {
for (int i = 0; i < hm.get(s).size() - 1; i += 2) {
hour += Integer.parseInt(hm.get(s).get(i + 1).split(":")[0])
- Integer.parseInt(hm.get(s).get(i).split(":")[0]);
minute += Integer.parseInt(hm.get(s).get(i + 1).split(":")[1])
- Integer.parseInt(hm.get(s).get(i).split(":")[1]);
}
hour += 23 - Integer.parseInt(hm.get(s).get(hm.get(s).size() - 1).split(":")[0]);
minute += 59 - Integer.parseInt(hm.get(s).get(hm.get(s).size() - 1).split(":")[1]);
}
sum = hour * 60 + minute;
if (sum <= fees[0]) { // 기본 요금이면
answer.add(fees[1]);
} else { // 기본 시간을 초과했으면
sum = (int) Math.ceil((double) (sum - fees[0]) / fees[2]) * fees[3];
answer.add(sum + fees[1]);
}
}
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/JAVA 자바] 모음 사전 (0) | 2023.09.25 |
|---|---|
| [프로그래머스/JAVA 자바] 게임 맵 최단거리 (0) | 2023.09.17 |
| [프로그래머스/JAVA 자바] [3차] n진수 게임 (0) | 2023.09.05 |
| [프로그래머스/JAVA 자바] 압축 (0) | 2023.09.04 |
| [프로그래머스/JAVA 자바] k진수에서 소수 개수 구하기 (0) | 2023.09.04 |