티스토리 뷰

Algorithm

[백준] S2 5464 주차장 (java)

코딩브론즈 2021. 7. 13. 17:28

https://www.acmicpc.net/problem/5464

 

5464번: 주차장

시내 주차장은 1부터 N까지 번호가 매겨진 N개의 주차 공간을 가지고 있다. 이 주차장은 매일 아침 모든 주차 공간이 비어 있는 상태에서 영업을 시작하며, 하룻동안 다음과 같은 방식으로 운영

www.acmicpc.net

 

풀이

 

1) 주차칸에 몇번 차가 주차중인지 저장하는 cars[] 배열과 기다리는 차를 담을 waitng 큐를 생성.

2) 입차인 경우

2-1) 빈자리가 있을경우 가장 앞의 빈자리에 차를 주차한다.

2-2) 빈자리가 없을경우 큐에 저장한다.

3) 출차인 경우

3-1) 해당 차를 찾고 주차요금을 계산하여 sum에 더함. 해당 자리 cars[n] 은 0으로 초기화.

3-2) 만약 queue가 비어있지 않다면 해당 자리 cars[n] 에 해당 차 번호를 저장.

4) sum 출력

 

주의사항

 

1) 요금은 출차할때 계산하는게 편하다.

 

package com.baekJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_S2_5464_주차장 {
	static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	static int N,M,Rs[],Wk[], cars[];
	public static void main(String[] args) throws NumberFormatException, IOException {
		input = new BufferedReader(new StringReader(src));
		tokens = new StringTokenizer(input.readLine());
		N = Integer.parseInt(tokens.nextToken());
		M = Integer.parseInt(tokens.nextToken());
		Rs = new int[N+1];
		cars = new int[N+1];
		Wk = new int[M+1];
		for(int n=1; n<=N; n++) {
			Rs[n] = Integer.parseInt(input.readLine());
		}
		for(int m=1; m<=M; m++) {
			Wk[m] = Integer.parseInt(input.readLine());
		}
		
		int sum = 0;
		Queue<Integer> wating = new LinkedList<>();
		outer : for(int t=0; t<2*M; t++) {
			int car = Integer.parseInt(input.readLine());
			
			if(car >= 0) { // 입차
				// 빈자리 있는지 확인
				for(int n=1; n<N+1; n++) { // 빈자리 있을경우
					if(cars[n] == 0) {
						cars[n] = car;
						continue outer;
					}
				}
				// 빈자리 없을 경우
				wating.offer(car);
				
			}else { // 출차
				for(int n=1; n<N+1; n++) {
					if(cars[n] == car*(-1)) {
						cars[n] = 0;
						sum += Rs[n] * Wk[car*(-1)];
						if(!wating.isEmpty()) {
							cars[n] = wating.poll();
						}
						break;
					}
				}
			}
		}
		
		System.out.println(sum);
	}

	static String src =
			"2 4\r\n"
			+ "5\r\n"
			+ "2\r\n"
			+ "100\r\n"
			+ "500\r\n"
			+ "1000\r\n"
			+ "2000\r\n"
			+ "3\r\n"
			+ "1\r\n"
			+ "2\r\n"
			+ "4\r\n"
			+ "-1\r\n"
			+ "-3\r\n"
			+ "-2\r\n"
			+ "-4";
}

 

후기

 

 생각보다 오래 걸렸다. 처음에는 대기해야 한다는 것을 까먹고 큐를 안썼고 두 번째에는 2개의 큐(입차, 출차)를 사용해서 하려다가 실패했다. 코드를 쓰면서도 뭔가 깔끔하지 않다고 생각했는데 결과를 보니 자바로 푼 사람들중에 가장 빠른 시간으로 풀어서 뿌듯하다(2등이랑 2배차이난다 ㅎㅎ)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함