[프로그래머스] 주차 요금 계산 (구현_JAVA)

2024. 2. 1. 11:18· [자료구조] 알고리즘
목차
  1. 문제
  2. 설계
  3. 알고리즘 설계 [접근 방법] : 구현
  4. 풀이과정
  5. 코드

문제

 

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
  1. 문제
  2. 설계
  3. 알고리즘 설계 [접근 방법] : 구현
  4. 풀이과정
  5. 코드
'[자료구조] 알고리즘' 카테고리의 다른 글
  • [백준] 18870번 좌표압축 (이분탐색_JAVA)
  • [백준] 17086번 아기상어2 (BFS_JAVA)
  • [백준] 15591번 MooTube (DFS_JAVA)
  • [자료구조] Deque(덱/데크)가 무엇일까?
콩지연
콩지연
콩지연
콩알탄의 코딩 실력 폭발 도전기
콩지연
전체
오늘
어제
  • 분류 전체보기 (77)
    • [자료구조] 알고리즘 (55)
    • [CS] 네트워크 (1)
    • 백엔드 (11)
    • 자바 (0)
    • 다양한 후기 (0)
    • 영어 (1)

인기 글

최근 글

hELLO · Designed By 정상우.v4.2.1
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.