Step-by-Step

[Java] 프로그래머스 - 주차 요금 계산 본문

언어/JAVA

[Java] 프로그래머스 - 주차 요금 계산

희주(KHJ) 2022. 9. 22. 15:47

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

일상에서 볼 수 있는 유료주차장의 계산 방식 똑같이 적용하면 된다.

단, 나갔다 다시 들어와도 기본요금을 적용하지 않고, 시간 누적 후 한 번에 정산하는 방식으로 진행된다.

 

시간 단위는 모두 분으로 바꿈

 

※ 문제 풀이에 사용된 필드

1. 주차장에 들어온 모든 차량 저장(중복X) : ArrayList  - cars

2. 현재 들어온 후 나가지 않은 차량 : HashMap - parking (차번호, 들어온시간)

3.  각 차량별 누적 주차 시간 : HashMap - totTime (차번호,  누적시간)

 

 

문제 풀이 방식은 다음과 같다.

1. 들어오면(IN)

- 신규차량에 관계없이 parking에 추가

- 신규차량이면 cars에 번호 추가 + totTime에 (차번호, 0분)으로 추가

 

2. 나가면(OUT)

- 시간 계산 후 totTime에 누적시간 갱신

- parking에서 삭제

 

3. records 기록을 다 읽고, 남은 차량 정산

- parking에 있는 기록들 다 읽어옴 (들어오고 나가지 않은 차들)

- "23:59 차번호 OUT"으로 문자열 생성후, 누적 시간계산

 

4. 시간 계산

- Collection 이용해서 cars 번호순으로 정렬

- 각 번호의 totTime 정보 읽어와서 요금 계산

- int[] res에 담아서 리턴

 

import java.util.*;

class Solution {
    HashMap<String,String> parking = new HashMap<>();
	HashMap<String,Integer> totTime = new HashMap<>();
    
    public int[] solution(int[] fees, String[] records) {
		// 들어왔다 나간 모든 차
		ArrayList<String> cars = new ArrayList<String>();
		
		for(int i=0; i<records.length; i++) {
			String[] str = records[i].split(" ");
			
			// 들어온 차
			if(str[2].equals("IN")) {
				parking.put(str[1], str[0]);
				// 처음 들어온 차
				if(!cars.contains(str[1])) {
					totTime.put(str[1], 0);
					cars.add(str[1]);
				}
			}
			// 나간 차
			else {
				int time = calTime(records[i]);
				parking.remove(str[1]);
				totTime.put(str[1], totTime.get(str[1])+time);
			}
		}
		
		for(Map.Entry<String, String> e : parking.entrySet()) {
			int time = calTime("23:59 "+ e.getKey()+" OUT");
			totTime.put(e.getKey(), totTime.get(e.getKey())+time);
		}
		
		Collections.sort(cars);
		System.out.println(cars);
		int[] res = new int[cars.size()];
		for(int i = 0; i<cars.size(); i++) {
			res[i] = calFee(fees,totTime.get(cars.get(i)));
		}
        
        return res;
    }
    
    public int calTime(String outRecord) {	
		String[] str = outRecord.split(" ");
		
		String in = parking.get(str[1]);
		String out = str[0];
		
		int hour = Integer.parseInt(out.substring(0,2))-Integer.parseInt(in.substring(0,2));
		int min = Integer.parseInt(out.substring(3))-Integer.parseInt(in.substring(3));
		
		return hour * 60 + min;
	}
	
	public int calFee(int[] fees, int time) {
		time -= fees[0];
		if(time <= 0)
			return fees[1];
		return fees[1] + (int)(Math.ceil((double)time/fees[2]) * fees[3]);
	}
}

 

 

※ 주의!!!

		for(Map.Entry<String, String> e : parking.entrySet()) {
			int time = calTime("23:59 "+ e.getKey()+" OUT");
			totTime.put(e.getKey(), totTime.get(e.getKey())+time);
			parking.remove(e.getKey());
		}

- 출차기록이 없는 차들 조회할때 parking.remove(e.getKey()); 삭제 코드를 넣으면 런타임 에러 발생한다

- Key를 사용하고 있는데, 삭제해서 그런듯. 없애도 정상 출력이 가능하지 넣지 마세요!

 

 

Comments