쵼쥬
쵼쥬의 개발공부 TIL
쵼쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (276)
    • 코딩테스트 (192)
      • [알고리즘] 알고리즘 정리 (7)
      • [백준] 코딩테스트 연습 (126)
      • [프로그래머스] 코딩테스트 연습 (59)
    • Spring (71)
      • [인프런] 스프링 핵심 원리- 기본편 (9)
      • [인프런] 스프링 MVC 1 (6)
      • [인프런] 스프링 MVC 2 (4)
      • [인프런] 실전! 스프링 부트와 JPA 활용1 (7)
      • [인프런] 실전! 스프링 부트와 JPA 활용2 (5)
      • [인프런] 실전! 스프링 데이터 JPA (7)
      • [인프런] 실전! Querydsl (7)
      • JWT (5)
      • [인프런] Spring Cloud (17)
      • [인프런] Spring Batch (4)
    • Java (6)
      • [Java8] 모던인자바액션 (4)
      • [부스트코스] 웹 백엔드 (2)
      • [패스트캠퍼스] JAVA STREAM (0)
    • CS (6)
      • 디자인 패턴과 프로그래밍 패터다임 (2)
      • 네트워크 (4)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 스프링
  • 비트마스킹
  • 자바
  • 알고리즘
  • 코딩테스트
  • 부스트코스
  • spring
  • 백분
  • 위클리 챌린지
  • 타임리프
  • 누적합
  • BFS
  • querydsl
  • 프로그래머스
  • 인프런
  • 구현
  • 백준
  • jpa
  • MVC
  • Spring Data JPA

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쵼쥬

쵼쥬의 개발공부 TIL

독서실 거리두기 - 20665번
코딩테스트/[백준] 코딩테스트 연습

독서실 거리두기 - 20665번

2021. 10. 27. 16:17


풀이 방법

그냥 차근차근 구현을 통해 풀이했다. 먼저 입력받은 시간을 분으로 변경해서 배열에 저장했다.

정렬을 통해 순서를 정해주고 우선순위 큐를 통해 꺼내는 순서를 정해주었다. 

큐에 넣고 꺼낼 때마다 가장 멀리 있는 좌석을 선택해서 관리자가 들어갈 수 있는지 확인해주었다.

 

내 코드

package com.company;

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

public class Main {
    static int N, T, P;
    static int[][] arr;
    static int[] seat;
    static PriorityQueue<Man> pq = new PriorityQueue<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        T = Integer.parseInt(st.nextToken());
        P = Integer.parseInt(st.nextToken());
        arr = new int[T][2];
        seat = new int[N + 1];

        for (int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int finish = Integer.parseInt(st.nextToken());

            arr[i][0] = (start / 100) * 60 + (start % 100);
            arr[i][1] = (finish / 100) * 60 + (finish % 100);
        }

        Arrays.sort(arr, ((o1, o2) -> {
            if (o1[0] < o2[0])
                return -1;
            else if (o1[0] == o2[0] && o1[1] - o1[0] < o2[1] - o2[0])
                return -1;

            return 1;
        }));

        int time = 540;
        int answer = 0;


        for (int i = 0; i < arr.length; i++) {
            while (!pq.isEmpty() && arr[i][0] >= pq.peek().getFinish()) {
                Man m = pq.poll();
                findSeat();
                if (seat[P] != 0 && time == 0) {
                    time = m.getFinish();
                }
            }
            pq.add(new Man(arr[i][0], arr[i][1], findSeat()));
            findSeat();

            if (seat[P] == 0 && time != 0) {
                answer += arr[i][0] - time;
                time = 0;
            }
        }

        while (!pq.isEmpty()) {
            Man m = pq.poll();
            findSeat();
            if (seat[P] != 0 && time == 0) {
                time = m.getFinish();
            }
        }

        if (time != 0) {
            answer += 1260 - time;
        }

        System.out.println(answer);
    }

    static int findSeat() {
        int max = 1;
        int index = 1;
        Arrays.fill(seat, 100);

        for (Man m : pq) {
            int x = m.getSeat();
            for (int j = N; j >= 1; j--) {
                seat[j] = Math.min(Math.abs(j - x), seat[j]);
            }
        }

        for (int i = seat.length - 1; i > 0; i--) {
            if (seat[i] == 100)
                continue;
            if (max <= seat[i]) {
                max = seat[i];
                index = i;
            }
        }

        return index;
    }

}

class Man implements Comparable<Man> {
    private int start;
    private int finish;
    private int seat;

    @Override
    public int compareTo(Man other) {
        if (this.finish < other.finish) {
            return -1;
        }
        return 1;
    }

    Man(int start, int finish, int seat) {
        this.start = start;
        this.finish = finish;
        this.seat = seat;
    }

    public int getFinish() {
        return finish;
    }

    public int getSeat() {
        return seat;
    }

    public int getStart() {
        return start;
    }
}

'코딩테스트 > [백준] 코딩테스트 연습' 카테고리의 다른 글

A -> B - 16953번  (0) 2021.11.02
특정한 최단 경로 - 1504번  (0) 2021.11.01
뱀과 사디리 게임 - 16928번  (0) 2021.10.27
택배 - 1719번  (0) 2021.10.26
점수따먹기 - 1749번  (0) 2021.10.25
    '코딩테스트/[백준] 코딩테스트 연습' 카테고리의 다른 글
    • A -> B - 16953번
    • 특정한 최단 경로 - 1504번
    • 뱀과 사디리 게임 - 16928번
    • 택배 - 1719번
    쵼쥬
    쵼쥬

    티스토리툴바