[BOJ] 1931번: 회의실 배정 (Greedy)

728x90

 

 

문제 링크

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

 

 

TIL

  • 처음에는 key-value의 형태로 시간을 기록할까 했지만, 시간 범위가 2^31인걸보고 절대 안되겠다 싶어서 다른 방법 생각
  • 남은 방법은 주어진 회의들에 대해서 순회하면서 넣을까 말까 고민하는 것이었기에 빠른 회의 순으로 나열해야한다고 생각함
  • 나열한 미팅 리스트를 순회하며
    • 만약 다음 회의의 시작 시간이 현재 회의가 끝나는 시간보다 뒤면 가능 (cnt 추가하고 변수 업뎃)
      • if me <= meetings[i][0]:
      • 중요한 거는 여기서 =을 꼭 붙여야한다는 점 !!!! 이거 안해서 처음에 틀림. 끝나는 것과 시작하는 것은 동일할 수 있음
    • 만약 다음 회의의 끝나는 시간이 현재 회의 끝나는 시간보다 작으면 변수만 업뎃 (더 짧으니까)
    • 두 개 모두 포함되지 않는 경우에는 아무것도 실행안함
  • 나름 빠르게 풀이가 생각나서 빨리 푼 문제지만 ,, 
    (그리디라는 걸 알고 풀어서 풀이가 바로 생각난걸수도 ...  ㅠ)

 

Code

[ 내 코드]

N = int(input())
meetings = []
for i in range(N):
    s, e = map(int, input().split())
    meetings.append((s,e))

meetings.sort()
cnt = 1
me = meetings[0][1]

for i in range(1, N):
    if me > meetings[i][1]:
        me = meetings[i][1]
        continue
    if me <= meetings[i][0]:
        cnt += 1
        me = meetings[i][1]
        continue
    else: continue

print(cnt)

 

 

 

[ 다른 사람 코드 궁금해서 찾아봄 ]

import sys

n = int(input())

endpoint: int = 0
answer: int = 0

arr = []

for i in range(0,n):
    a, b = map(int,sys.stdin.readline().rstrip().split())
    arr.append([a,b])

arr.sort(key=lambda x: (x[1], x[0]))

for newstart, newend in arr:
    if endpoint <= newstart:
        answer += 1
        endpoint = newend
print(answer)

 

  • 나와 다르게 끝나는 시간이 더 짧은 경우, 업데이트를 안했음
  • 이래도 되나? 싶어 고민해보니 어차피 Sort 하면 시작 시간이 같다는 전제 하에 끝나는 시간이 더 짧은 시간이 존재할 수 없지만, 
    • 시간 시간이 다른 경우에는 가능해서 .. 이 코드로는 반례가 발생하지 않을까 생각이 듦 (정답 코드이긴 했음 ,, )
    • (1, 8), (2,3), (3, 6) 인 경우에 안되지 않나 .. ? 라고 생각함
  • ㅁ ㅣ 친 . 애초에 정렬은 끝나는 시간 기준으로 해서 그런 상황이 발생하지 않음!!!
    • 좋은 코드다 ~

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 2293번: 동전 1 (DP)  (1) 2025.04.17
[BOJ] 12919번: A와 B 2  (0) 2025.04.16
[BOJ] 1541번: 잃어버린 괄호 (Greedy)  (0) 2025.04.15
[BOJ] 1916번: 최소비용 구하기 (Dijkstra)  (0) 2025.04.06
[BOJ] 1261번: 알고스팟 (Dijkstra)  (0) 2025.04.06