문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

설계
알고리즘 설계 [접근 방법] : 구현
특별한 알고리즘 방식이 있는 문제가 아니라 그냥 구현한는 문제다.
그래서 다양한 방법이 있을 것이라 생각된다. 나는 map을 중심으로 구현을 했다.
풀이과정
1.
입차/출차 기록을 담을 infoMap과 각각의 자동차가 주차를 총 몇 분했는지 담을 timeMap을 생성한다.
주차시간을 담을 map은 자동차 번호로 정렬해야하므로, comparator을 사용한다.
2.
자동차 정보가 문자열로 입력받으므로, 문자열을 " " 기준으로 자른다.
만약 입차하는 차량이라면 infoMap에 자동차 번호와 입차 시간을 저장한다.
여기서 시간을 저장할 때, 계산하기 편하게 입차시간을 분으로 변경 후 저장한다.
현재 시간을 분으로 저장하는 것은 따로 메서드를 만들었다.
현재 시간을 ':' 기준으로 자른 후 (시간*60) + 분 으로 계산했다.
3.
만약 출차하는 차량이라면, infoMap에 입차 기록이 있을 것이다.
infoMap에서 입차시간을 가져온 후, 총 주차시간을 저장하는 timeMap에 출차시간-입차시간을 저장한다.
그리고 infoMap에서 차량 정보를 삭제한다.
4.
입차를 했지만, 출차를 하지 않은 경우, infoMap에 정보가 남아있을 것이다.
그 차량들은 출차시간을 23:59로 설정한 후, 출차시간-입차시간을 timeMap에 저장한다.
5.
모든 차량의 총 주차시간을 timeMap에 저장했다면, 주차비용을 계산한다.
요금을 저장할 list를 생성한다.
timeMap을 순회하면서 총 주차시간이 기본 시간보다 작거나 같다면 기본 요금만 저장한다.
만약 기본 시간보다 더 많이 주차했다면, 추가 요금을 계산하여 list에 저장한다.
6.
list를 배열로 변경 후 return한다.
코드
import java.util.*;
import java.time.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
List<Integer> list = new ArrayList();
//입차, 출차 기록을 담을 map
Map<String, Integer> infoMap = new HashMap();
//총 주차시간을 담을 map
Map<String, Integer> timeMap = new TreeMap(new Comparator<String>() {
public int compare(String o1, String o2) {
int into1 = Integer.parseInt(o1);
int into2 = Integer.parseInt(o2);
return into1-into2;
}
});
int baseTime = fees[0];
int basePay = fees[1];
int partTime = fees[2];
int partPay = fees[3];
//차 번호마다 총 주차시간을 분단위로 저장하기
for(String record : records) {
String[] info = record.split(" ");
int time = changeTime(info[0]);
String carNum = info[1];
String io = info[2];
//만약 입차하는 차량이라면,
if(io.equals("IN")) infoMap.put(carNum, time);
//출차하는 차량이라면,
else {
int inTime = infoMap.get(carNum);
timeMap.put(carNum, timeMap.getOrDefault(carNum, 0)+(time-inTime));
infoMap.remove(carNum);
}
}
//입차를 했지만, 출차를 하지 않은 경우
Set<String> set = infoMap.keySet();
for(String carNum : set) {
int lastTime = changeTime("23:59");
int inTime = infoMap.get(carNum);
if(timeMap.containsKey(carNum)) timeMap.put(carNum, timeMap.get(carNum)+(lastTime-inTime));
else timeMap.put(carNum, lastTime-inTime);
}
//주차비용 계산하기
for(String key : timeMap.keySet()){
int total = timeMap.get(key);
if(total<=baseTime) list.add(basePay);
else list.add(basePay+(int)(Math.ceil((total-baseTime)/(partTime*1.0))*partPay));
}
//list를 배열로 변경
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
//시간을 분 단위로 변경하는 메서드
public static int changeTime(String time){
String[] timeArr = time.split(":");
return (Integer.parseInt(timeArr[0])*60) + Integer.parseInt(timeArr[1]);
}
}
(❁´◡`❁)
끝!
'[자료구조] 알고리즘' 카테고리의 다른 글
[백준] 18870번 좌표압축 (이분탐색_JAVA) (0) | 2024.02.06 |
---|---|
[백준] 17086번 아기상어2 (BFS_JAVA) (0) | 2024.02.05 |
[백준] 15591번 MooTube (DFS_JAVA) (0) | 2024.01.24 |
[자료구조] Deque(덱/데크)가 무엇일까? (0) | 2024.01.23 |
[백준] 5430번 AC (Deque_JAVA) (0) | 2024.01.23 |
문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

설계
알고리즘 설계 [접근 방법] : 구현
특별한 알고리즘 방식이 있는 문제가 아니라 그냥 구현한는 문제다.
그래서 다양한 방법이 있을 것이라 생각된다. 나는 map을 중심으로 구현을 했다.
풀이과정
1.
입차/출차 기록을 담을 infoMap과 각각의 자동차가 주차를 총 몇 분했는지 담을 timeMap을 생성한다.
주차시간을 담을 map은 자동차 번호로 정렬해야하므로, comparator을 사용한다.
2.
자동차 정보가 문자열로 입력받으므로, 문자열을 " " 기준으로 자른다.
만약 입차하는 차량이라면 infoMap에 자동차 번호와 입차 시간을 저장한다.
여기서 시간을 저장할 때, 계산하기 편하게 입차시간을 분으로 변경 후 저장한다.
현재 시간을 분으로 저장하는 것은 따로 메서드를 만들었다.
현재 시간을 ':' 기준으로 자른 후 (시간*60) + 분 으로 계산했다.
3.
만약 출차하는 차량이라면, infoMap에 입차 기록이 있을 것이다.
infoMap에서 입차시간을 가져온 후, 총 주차시간을 저장하는 timeMap에 출차시간-입차시간을 저장한다.
그리고 infoMap에서 차량 정보를 삭제한다.
4.
입차를 했지만, 출차를 하지 않은 경우, infoMap에 정보가 남아있을 것이다.
그 차량들은 출차시간을 23:59로 설정한 후, 출차시간-입차시간을 timeMap에 저장한다.
5.
모든 차량의 총 주차시간을 timeMap에 저장했다면, 주차비용을 계산한다.
요금을 저장할 list를 생성한다.
timeMap을 순회하면서 총 주차시간이 기본 시간보다 작거나 같다면 기본 요금만 저장한다.
만약 기본 시간보다 더 많이 주차했다면, 추가 요금을 계산하여 list에 저장한다.
6.
list를 배열로 변경 후 return한다.
코드
import java.util.*;
import java.time.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
List<Integer> list = new ArrayList();
//입차, 출차 기록을 담을 map
Map<String, Integer> infoMap = new HashMap();
//총 주차시간을 담을 map
Map<String, Integer> timeMap = new TreeMap(new Comparator<String>() {
public int compare(String o1, String o2) {
int into1 = Integer.parseInt(o1);
int into2 = Integer.parseInt(o2);
return into1-into2;
}
});
int baseTime = fees[0];
int basePay = fees[1];
int partTime = fees[2];
int partPay = fees[3];
//차 번호마다 총 주차시간을 분단위로 저장하기
for(String record : records) {
String[] info = record.split(" ");
int time = changeTime(info[0]);
String carNum = info[1];
String io = info[2];
//만약 입차하는 차량이라면,
if(io.equals("IN")) infoMap.put(carNum, time);
//출차하는 차량이라면,
else {
int inTime = infoMap.get(carNum);
timeMap.put(carNum, timeMap.getOrDefault(carNum, 0)+(time-inTime));
infoMap.remove(carNum);
}
}
//입차를 했지만, 출차를 하지 않은 경우
Set<String> set = infoMap.keySet();
for(String carNum : set) {
int lastTime = changeTime("23:59");
int inTime = infoMap.get(carNum);
if(timeMap.containsKey(carNum)) timeMap.put(carNum, timeMap.get(carNum)+(lastTime-inTime));
else timeMap.put(carNum, lastTime-inTime);
}
//주차비용 계산하기
for(String key : timeMap.keySet()){
int total = timeMap.get(key);
if(total<=baseTime) list.add(basePay);
else list.add(basePay+(int)(Math.ceil((total-baseTime)/(partTime*1.0))*partPay));
}
//list를 배열로 변경
int[] answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
//시간을 분 단위로 변경하는 메서드
public static int changeTime(String time){
String[] timeArr = time.split(":");
return (Integer.parseInt(timeArr[0])*60) + Integer.parseInt(timeArr[1]);
}
}
(❁´◡`❁)
끝!
'[자료구조] 알고리즘' 카테고리의 다른 글
[백준] 18870번 좌표압축 (이분탐색_JAVA) (0) | 2024.02.06 |
---|---|
[백준] 17086번 아기상어2 (BFS_JAVA) (0) | 2024.02.05 |
[백준] 15591번 MooTube (DFS_JAVA) (0) | 2024.01.24 |
[자료구조] Deque(덱/데크)가 무엇일까? (0) | 2024.01.23 |
[백준] 5430번 AC (Deque_JAVA) (0) | 2024.01.23 |