[ 기타 ]/코딩테스트

[백준/Java] 11000번 : 강의실 배정 / 그리디 알고리즘

2023. 6. 26. 09:08
목차
  1. Code

이 문제는 최소 한의 강의실을 사용해서 주어진 강의를 모두 가능하게 만드는 방법을 찾는 문제이다.

첫째 줄에 1 - 3 강의를 위해 강의실 1이 필요하고, 

둘째 줄에 2 - 4 강의를 위해 강의실 2가 필요하고,

셋째 줄에 3 - 5 강의를 시작 할 시점에는 강의실 1에서 강의가 끝난 시점 이므로 강의실 1을 이용할 수 있다.

 

그래서 총 강의실 2개가 필요하다는 결과가 나온다.

 

예제 입력은 단 3개 뿐이라 쉽지만, 입력이 많아지면 어떻게 해야 할까?

 

일단 시작시간이 빠른 순으로 정렬해야 한다.

어차피 빠른 시각에 시작하는 강의를 먼저 처리해야 하기때문이다.

그런데 추가로 종료시간도 빠른 순으로 정렬해야지 편할 것이다.

 

따라서 시작시간이 같을 경우 종료시간이 빠른 순으로, 이외에는 시작시간이 빠른 순으로 정렬한다.

 

그리고 강의실을 나타내는 PriorityQueue<Integer> room를 만들고, 이번에는 종료시간이 빠른 순으로 poll() 되도록 만든다.  그리고 이 우선순위 큐 room에는 종료시간만 저장한다.

 

그렇게 되면, 새로운 강의를 어느 강의실에 배정할 지 정할 때 room에서 가장 빠른 종료시간 값을 꺼내서 이 값과 새로운 강의의 시작시간을 비교한다.

만약 꺼낸 종료시간이 시작시간보다 크면 새로운 강의실을 사용해야 할 것이고,

꺼낸 종료시간이 시작시간보다 작으면 poll()한 뒤 room에 새로운 강의의 종료시간을 넣으면 될 것이다.

 

그리고 마지막에 남아있는 PriorityQueue<> room의 크기가 정답이 될 것이다.


Code

(1) 입력받은 강의의 우선순위를 정해준다.

 

(2) 강의를 입력받아서 pq에 저장한다.

 

(3) 강의실을 나타내고, 강의의 종료시간을 담을 우선순위 큐 room을 만든다.

 

(4) room에서 하나씩 값을 peek() 하여 값을 비교하고, poll()을 할지 말지 결정한다.

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

public class No11000{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st;
        // (1) 입력받은 강의의 우선순위를 정해준다.
        PriorityQueue<int[]> pq = new PriorityQueue<>(((o1, o2) -> {
            if(o1[0] == o2[0]){
                return o1[1] - o2[1];
            }else{
                return o1[0] - o2[0];
            }
        }));
        // (2) 강의를 입력받아서 pq에 저장한다.
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());

            pq.offer(new int[]{start, end});
        }
        // (3) 강의실을 나타내고, 강의의 종료시간을 담을 우선순위 큐 room을 만든다.
        PriorityQueue<Integer> room = new PriorityQueue<>();
        room.offer(0);
        
        // (4) room에서 하나씩 값을 peek() 하여 값을 비교하고, poll()을 할지 말지 결정한다.
        while(!pq.isEmpty()){
            int[] cur = pq.poll();
            if(room.peek() <= cur[0]){
                room.poll();
            }
            room.offer(cur[1]);
        }

        System.out.println(room.size());
    }
}
저작자표시 (새창열림)

'[ 기타 ] > 코딩테스트' 카테고리의 다른 글

[백준/Java] 1753번 : 최단경로 / 다익스트라(dijkstra)  (0) 2023.06.26
[JAVA/String] 알고리즘 문제풀이 시 유용한 String 문자열 다루기  (0) 2023.06.09
[백준/JAVA] 5430번 AC / 데크, 자료구조  (0) 2023.06.07
[JAVA] 코딩테스트 문제 풀이시 유용한 [ 람다식, 스트림 ] 사용 예제 모음  (0) 2023.06.07
[백준/JAVA] 11866번 : 요세푸스문제 0 / Queue 자료구조  (0) 2023.06.05
  1. Code
'[ 기타 ]/코딩테스트' 카테고리의 다른 글
  • [백준/Java] 1753번 : 최단경로 / 다익스트라(dijkstra)
  • [JAVA/String] 알고리즘 문제풀이 시 유용한 String 문자열 다루기
  • [백준/JAVA] 5430번 AC / 데크, 자료구조
  • [JAVA] 코딩테스트 문제 풀이시 유용한 [ 람다식, 스트림 ] 사용 예제 모음
HSRyuuu
HSRyuuu
Web Backend Developer happyhsryu
HSRyuuu
HS_dev_log
HSRyuuu
전체
오늘
어제
  • 전체 글 보기 (235)
    • Java (25)
    • Spring (29)
    • JPA & QueryDSL (13)
    • Database (17)
    • 자료구조 & 알고리즘 (30)
    • DevOps (10)
    • [ Computer Science ] (47)
      • Web & Network (14)
      • 프로그래밍 이론 (11)
      • 운영체제 (3)
      • 데이터베이스 이론 (5)
      • Linux 리눅스 (7)
    • [ Frontend ] (17)
      • Vue.js & Nuxt.js (9)
      • JSP_Thymeleaf (7)
    • [ 기타 ] (47)
      • 오픈소스 라이브러리 (5)
      • 코딩테스트 (13)
      • Trouble Shooting (7)
      • Tech Interview (6)
      • Book Review (9)
      • 끄적끄적... (5)
      • 개인 프로젝트 (2)

블로그 메뉴

  • 홈
  • 태그
  • github

공지사항

  • GitHub
  • 공부한 내용을 정리하고 기록하는 블로그 입니다.

인기 글

태그

  • cleancode
  • 백엔드기술면접
  • 클린코드
  • Redisson
  • TechInterview
  • 백엔드스쿨
  • web
  • HTTP
  • SQL
  • 백엔드
  • mybatis
  • 개발자
  • 제로베이스
  • springsecurity
  • vue3
  • 백엔드공부
  • MySQL
  • 트랜잭션
  • Linux
  • Nuxt3
  • 리눅스
  • Spring
  • Java
  • SpringBoot
  • Database
  • 기술면접
  • Redis
  • JPA
  • 백준
  • 자료구조

최근 댓글

최근 글

hELLO · Designed By 정상우.
HSRyuuu
[백준/Java] 11000번 : 강의실 배정 / 그리디 알고리즘
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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