[ALGORITHM]SWEA_D3_9280.진용이네주차타워

※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

위 말에 쫄아서 문제는 쓰지 않는다.

👉 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW9j74FacD0DFAUY&categoryId=AW9j74FacD0DFAUY&categoryType=CODE

코드

import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(new InputStreamReader(System.in));
        int testCase = scanner.nextInt();

        for (int t = 0; t < testCase; t++) {
            int n = scanner.nextInt(); //parking
            int m = scanner.nextInt(); //car
            int[] parkFee = new int[n + 1];
            int[] carFee = new int[m + 1];
            for (int i = 1; i <= n; i++) parkFee[i] = scanner.nextInt();
            for (int i = 1; i <= m; i++) carFee[i] = scanner.nextInt();

            int answer = 0;
            int[] park = new int[n+1];
            int times = m * 2;
            Queue<Integer> queue = new LinkedList<>();
            while (times-->0){
                int cur = scanner.nextInt();
                if (cur > 0){
                    boolean flag = true;
                    for (int i = 1; i <= n; i++){
                        if (park[i] == 0){
                            flag = false;
                            park[i] = cur;
                            answer += parkFee[i] * carFee[cur];
                            break;
                        }
                    }
                    if(flag) queue.add(cur);
                }else {
                    int empty = 0;
                    for (int i = 1; i <= n; i++){
                        if (park[i] == cur * -1){
                            park[i] = 0;
                            empty = i;
                        }
                    }
                    if (!queue.isEmpty()){
                        int curCar = queue.poll();
                        park[empty] = curCar;
                        answer += parkFee[empty] * carFee[curCar];
                    }
                }
            }
            System.out.println("#"+(t+1) + " " + answer);
        }
    }
}
  • 먼저 나는 주자장 위치별 요금이랑, 자동차별 요금을 Hash에 저장할까 하다가 배열에 했다.

    👉 어차피 1~n, 1~m까지 다 값이 존재하는 것이고, 배열이 hash역을 충분히 해줄수 있기 때문이다.

     int n = scanner.nextInt(); //parking
    int m = scanner.nextInt(); //car
    int[] parkFee = new int[n + 1];
    int[] carFee = new int[m + 1];
    for (int i = 1; i <= n; i++) parkFee[i] = scanner.nextInt();
    for (int i = 1; i <= m; i++) carFee[i] = scanner.nextInt();
    
  • 다음 모든 차들이 한번씩 들어오고, 한번씩 나가기 때문에 총 입력의 횟수는 자동차수 * 2 일 것이다.

    int times = m * 2;
    while(times-->0){
      //여기서 코드 실행
    }
    
  • park[] 배열을 만들어 현재 주차장 상황을 나타내는 배열을 만들었다.

  • times 동안 자동차를 입력 받는다.

    입력값이 0보다 클 경우는 들어오는 차에 해당한다.

    따라서, 이 경우 주차장에 자리가 있으면 넣어주고,

    없으면 대기 큐에 넣어준다.

     if (cur > 0){
       boolean flag = true;
       for (int i = 1; i <= n; i++)
         if (park[i] == 0){ //주차창에 빈 공간이 존재 할 시
           park[i] = cur;
           answer += parkFee[i] * carFee[cur];
           flag = false;//주차 한 경우,
           break;
         }
     }
    //flag가 T : 주차를 못한경우, flat가 F: 주차를 한 경우다.
    // 주차를 못했을 경우 대기 큐에 넣어준다.
    if(flag) queue.add(cur);
    

    입력값이 0보다 작은 경우는 나가는 차에 해당한다.

    이 경우, 차를 내보내고, 만약 큐에 대기차가 있다면 그 나간 자리에 넣어준다.

    else {
      int empty = 0;
      for (int i = 1; i <= n; i++){
        if (park[i] == cur * -1){//나가는 차의 위치를 찾아서,
          park[i] = 0;					// 0으로 변경시켜준다.
          empty = i;//자동차 나간 위치를 저장한다.
        }
      }
      // 대기하고 있는 자동차가 존재할 경우,
      if (!queue.isEmpty()){
        int curCar = queue.poll();
        park[empty] = curCar;
        answer += parkFee[empty] * carFee[curCar];
      }
    }
    

처음부터 모든 것을 큐에 넣고 시작하니 큐를 두개 써야하나 고민했다. 근데 넣을 수 있는 것은 넣고, 대기할 경우만 큐에 넣어주니 간단하게 해결되었다.

내 풀이에서 가장 아쉬운 경우는 배열을 매번 검사했다는 점이다. 빈 공간을 찾기 위해 처음부터 검사하고, 나가는 차를 찾기위해 처음부터 검사하고 👉 이부분을 나중에 수정해봐야겠다.

비고

오랜만에 재밌는 문제 풀었다.

문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW9j74FacD0DFAUY&categoryId=AW9j74FacD0DFAUY&categoryType=CODE

저장소 : https://github.com/yoo-chaewon/HELLO_JAVA/blob/master/Algorithm/3.SWEA/D3_9280_진용이네주차타워.java