SoShin_
소신
SoShin_
전체 방문자
오늘
어제
  • 분류 전체보기
    • Study
      • HTML | CSS
      • JavaScript
      • Django
      • Python
      • Flask
      • Git
      • Project
      • 이것저것
      • 코딩테스트
      • NestJS
    • Review
      • Book
      • Movie & Drama

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • orm
  • flask orm
  • 영화추천
  • js
  • node.js
  • Python
  • 플라스크
  • JavaScript
  • 유저기능
  • Django 유효성 검증
  • db
  • 장고
  • 장고 제네릭뷰
  • 영화리뷰
  • 문제풀이
  • openpyxl
  • allauth
  • Django
  • KakaoAPI
  • Django allauth
  • 파이썬
  • SQLite
  • 자바스크립트
  • FLASK
  • SQLAlchemy
  • 장고 유저기능
  • 위도경도
  • MongoDB
  • 장고 allauth
  • 코딩테스트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
SoShin_

소신

Study/코딩테스트

[ 문제 풀이 ] BOJ-1931 회의실 배정

2022. 2. 8. 22:03
반응형

📔 문제 설명

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다.
각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자.
단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다.
회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

🧰 변수 설명

  • N

    • 타입 : int
    • 저장 데이터 : 회의 개수를 입력 받아 저장
  • result

    • 타입 : deque
    • 저장 데이터 : 회의 사용 시간을 저장
  • count

    • 타입 : int
    • 저장 데이터 : 회의 수 카운트
  • end

    • 타입 : int
    • 저장 데이터 : 회의가 끝나는 시간을 저장

🖨풀이 과정

  1. 회의 개수를 입력받는다. [ N ]

  2. N번 만큼 반복하며 회의 시간을 입력받는다 [ result ]

  3. result를 회의가 빨리 끝나는 순으로 정렬 후, 한번 더 회의가 빨리 시작하는 순으로 정렬해준다.

  4. 정렬 후 가장 첫번째 값의 끝나는 시간을 end로 두고 count를 1로 선언한다.

  5. 처음 값을 뺏으므로 result에서 popleft()로 값을 하나 빼준다.
    [ pop()은 O(N)의 시간이 걸리지만 popleft()는 O(1)의 시간이 걸리므로 deque 사용]

  6. result에 값이 있는 동안 반복해주며, 회의 시작 시간이 end 보다 크거나 같으면 count를 증가시키고 end를 그 회의가 끝나는 시간으로 재할당 해준 후, result에서 popleft()를 통해 값을 빼준다.

6-1. 회의가 끝나는 시간보다 시작시간이 작은 경우에는 popleft()로 값만 빼준다.

import sys
from collections import deque
N = int(sys.stdin.readline())
result = []

for i in range(N):
    start, end = map(int, sys.stdin.readline().split())
    result.append((start, end))

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

count = 1
end = result[0][1]
result.popleft()

while result:
    if result[0][0] >= end:
        count += 1
        end = result[0][1]
        result.popleft()
    else:
        result.popleft()

print(count)

시간 : 332ms

반응형

'Study > 코딩테스트' 카테고리의 다른 글

[ 문제 풀이 ] BOJ-14501 퇴사  (0) 2022.03.13
[문제 풀이 ] 프로그래머스 최소 직사각형  (0) 2022.02.08
[문제 풀이] BOJ-2805 나무 자르기  (0) 2022.02.08
BOJ-1932 정수 삼각형  (0) 2022.02.08
[문제 풀이] BOJ - 1270 전쟁 - 땅따먹기  (0) 2022.02.02
    'Study/코딩테스트' 카테고리의 다른 글
    • [문제 풀이 ] 프로그래머스 최소 직사각형
    • [문제 풀이] BOJ-2805 나무 자르기
    • BOJ-1932 정수 삼각형
    • [문제 풀이] BOJ - 1270 전쟁 - 땅따먹기
    SoShin_
    SoShin_
    직접 쓰는 개발 블로그

    티스토리툴바