백준 1931번 | 골드 5 | 회의실 | Python

kimminjunnn·2025년 11월 26일

알고리즘

목록 보기
247/311

문제 출처 : https://www.acmicpc.net/problem/1931


문제 파악

  • 회의 개수 N (1 ≤ N ≤ 100,000)
  • 각 회의는
    • 시작 시간 s
    • 끝나는 시간 e
  • 한 회의가 끝나는 동시에 다음 회의 시작 가능
  • 회의실은 하나뿐

회의 시간이 겹치지 않게 회의를 최대 몇 개까지 넣을 수 있는지 구하는 문제이다.

핵심 아이디어

“끝나는 시간이 가장 빠른 회의부터 선택하자”

이유:

  • 일단 하나의 회의를 선택하면, 그 회의가 끝난 이후에만 다음 회의를 넣을 수 있다.
  • 그렇다면, “끝나는 시간이 빠른 회의”를 먼저 잡을수록 뒤에 더 많은 회의를 배치할 수 있다

그렇기에 회의 (시작 시간, 끝나는 시간) 중 끝나는 시간을 기준으로 오름차순으로 정렬하고, 만약 끝나는 시간이 같다면,

해답 및 풀이

import sys
input = sys.stdin.readline

N = int(input())

meetings = []
for _ in range(N):
    meetings.append(tuple(map(int,input().split())))

# 끝나는 기준 시간 오름차순 정렬, 만약 같다면 시작 시간 오름차순
meetings.sort(key=lambda x:(x[1],x[0]))

count = 0
end_time = 0 # 이전에 선택한 회의 끝나는 시간
for start, end in meetings:
    if start >= end_time:
        count += 1
        end_time = end

print(count)

sort(),sorted() 함수에서 key 는 매개변수로 정렬 기준.
여기선 lambda 라는 익명함수로 x[1],x[0] 을 기준하였으니 meeintgs의 튜플의 [1] 인 끝나는 시간으로 정렬된다.

lambda는 파이썬 문법으로

def add(x,y):
	return (x+y)

add = lambda x, y: x + y

로 표현할 수 있다. 화살표 함수와 비슷한듯 싶다

profile
Frontend Engineers

0개의 댓글