[백준] 11000번 강의실 배정 - 파이썬(Python)

2021. 11. 11. 12:38· 알고리즘/문제풀이
목차
  1. 나의 풀이 (Python)
  2. 나의 풀이 (Java)
  3. 코드 설명 및 풀이법
728x90
시간 제한 메모리
1 초 256 MB

 

문제 (링크)

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

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

나의 풀이 (Python)

import sys
import heapq
input = sys.stdin.readline

n = int(input())
arr = []

for _ in range(n):
    arr.append(list(map(int, input().split())))

arr.sort()
queue = []
heapq.heappush(queue, arr[0][1])

for i in range(1, n):
    if not queue:
        heapq.heappush(queue, arr[i][1])
    
    else:
        if queue[0] <= arr[i][0]:
            heapq.heappop(queue)
            heapq.heappush(queue, arr[i][1])
        
        else:
            heapq.heappush(queue, arr[i][1])

print(len(queue))

나의 풀이 (Java)

import java.util.*;

public class Main {
	
    static class Lesson implements Comparable<Lesson> {
    	private final int start;
        private final int end;
        
        public Lesson(int start, int end) {
        	this.start = start;
            this.end = end;
        }
        
        public int compareTo(Lesson compare) {
        	if (this.start == compare.start) {
            	return this.end - compare.end;
            }
            
            return this.start - compare.start;
        }
    }
    
    public int solution(List<Lesson> lessons) {
    	Collections.sort(lessons);
		PriorityQueue<Integer> queue = new PriorityQueue<>();
        queue.add(lessons.get(0).end);
        
        for (int i = 1; i < lessons.size(); i++) {
        	if (queue.isEmpty()) {
            	queue.add(lessons.get(i).end);
            }
            
            else {
            	if (queue.peek() <= lessons.get(i).start) {
                	queue.poll();
                    queue.add(lessons.get(i).end);
                }
                
                else {
                	queue.add(lessons.get(i).end);
                }
            }
        }
        
        return queue.size();
    }
    
    
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        List<Lesson> lessons = new ArrayList<>();
        
        for (int i = 0; i < N; i++) {
        	int start = sc.nextInt();
            int end = sc.nextInt();
            lessons.add(new Lesson(start, end));
        }
    
    	Main main = new Main();
        System.out.println(main.solution(lessons));
    }
}

 

코드 설명 및 풀이법

시간제한이 1초이기 때문에 O(n^2)의 시간복잡도로는 시간초과가 뜬다.

 

큐를 사용해서 문제를 해결할 수 있다.

 

우선, 시작으로 맨 첫 강의가 끝나는 시간을 큐에 넣어준다.

 

그 후, 강의를 하나씩 돌면서 현재 큐에 있는 시간과 강의 시작 시간을 비교해서 시작 시간이 끝나는 시간보다 크거나 같다면, 강의장을 추가할 필요가 없는 것이므로 기존에 들어있던 값을 pop해주고, 새 강의의 끝나는 시각을 업데이트 해준다.

 

만약 다음에 들어오는 강의의 시작시간이 현재 큐에 있는 강의 종료 시각보다 작다면, 새로운 강의장이 필요하다는 의미이므로 그대로 해당 강의의 끝나는 시각을 추가해주면 된다.

 

모든 강의를 돌고 난 후, 큐에 남아있는 원소의 개수가 필요한 강의장의 수가 된다.

저작자표시 (새창열림)

'알고리즘 > 문제풀이' 카테고리의 다른 글

[백준] 19237번 어른 상어 - 파이썬(Python)  (0) 2021.11.15
[백준] 1766번 문제집 - 파이썬(Python)  (0) 2021.11.11
[백준] 2252번 줄 세우기 - 파이썬(Python)  (0) 2021.11.11
[백준] 1963번 소수 경로 - 파이썬 (Python)  (0) 2021.10.20
[백준] 14719번 빗물 - 파이썬(Python)  (0) 2021.10.19
  1. 나의 풀이 (Python)
  2. 나의 풀이 (Java)
  3. 코드 설명 및 풀이법
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준] 19237번 어른 상어 - 파이썬(Python)
  • [백준] 1766번 문제집 - 파이썬(Python)
  • [백준] 2252번 줄 세우기 - 파이썬(Python)
  • [백준] 1963번 소수 경로 - 파이썬 (Python)
SeongOnion
SeongOnion
서버는 꺼지지 않아요
SeongOnion
조무래기 코딩
SeongOnion
전체
오늘
어제
  • 분류 전체보기 (167)
    • 알고리즘 (81)
      • 이론 (8)
      • 문제풀이 (73)
    • 언어 (15)
      • Python (9)
      • JavaScript (1)
      • JAVA (5)
    • 데이터베이스 (5)
    • 프레임워크 (15)
      • Django (7)
      • Spring (8)
    • 그 외 공부 (38)
      • 운영체제 (1)
      • 자료구조 (14)
      • 네트워크 (5)
      • CS (2)
      • 기타 (7)
      • 트러블 슈팅 (9)
    • 프로젝트 (0)
    • 개발자취 (8)
    • 회고 (3)
    • 주저리주저리 (1)
    • 기타 (비개발) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이진탐색
  • 정렬 알고리즘
  • DRF
  • 프로그래머스
  • 소수
  • 투 포인터 알고리즘
  • 스택
  • 컨트리뷰트
  • Django
  • BFS
  • spring
  • 자바
  • 개발자
  • 데이터베이스
  • 코딩테스트
  • 파이썬
  • DP
  • 큐
  • 회고
  • 백준
  • 트러블 슈팅
  • 장고
  • 그리디알고리즘
  • 웹
  • BFS/DFS
  • 코딩
  • 브루트포스
  • 오픈소스
  • 알고리즘
  • 에라토스테네스의 체

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
SeongOnion
[백준] 11000번 강의실 배정 - 파이썬(Python)
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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