문제링크
https://www.acmicpc.net/problem/13414
문제설명
문제
국민대학교에서는 매 학기 시작 전 종합정보시스템에서 수강신청을 한다. 매 수강신청마다 아주 많은 학생들이 몰려 서버에 많은 부하가 가기 때문에, 국민대학교에서는 수강신청 부하 관리 시스템을 도입하기로 결정하였다. 새로운 관리 시스템은 다음과 같은 방식으로 동작한다.
- 수강신청 버튼이 활성화 된 후, 수강신청 버튼을 조금이라도 빨리 누른 학생이 대기목록에 먼저 들어간다.
- 이미 대기열에 들어가 있는 상태에서 다시 수강신청 버튼을 누를 경우 대기목록의 맨 뒤로 밀려난다.
- 잠시 후 수강신청 버튼이 비활성화 되면, 대기목록에서 가장 앞에 있는 학생부터 자동으로 수강신청이 완료되며, 수강 가능 인원이 꽉 찰 경우 나머지 대기목록은 무시하고 수강신청을 종료한다.
위의 표는 최대 수강 가능 인원이 3명인 알고리즘 수업에 대해 6명의 학생이 수강신청을 진행한 모습이다. 버튼이 비활성화 된 후, 먼저 규칙 1을 적용하여 클릭을 2번 이상 한 학생의 중복된 대기목록을 삭제한다. 중복된 목록을 제거한 후, 맨 앞에서부터 최대 수강 가능 인원인 3명을 선정한다. 표의 맨 오른쪽에는 그 최종결과를 나타낸 모습이다. 이와 같은 방법을 이용하여 최종적으로 수강신청에 성공한 인원을 출력하는 프로그램을 작성하시오.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목록의 길이 L(1 ≤ L ≤ 500,000)이 주어진다. 두 번째 줄부터 L개의 줄에는 수강신청을 버튼을 클릭한 학생의 학번이 클릭 순서대로 주어진다. 학번은 8자리의 숫자로 이루어져 있다.
출력
출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 수강신청 관리 시스템의 규칙을 적용한 후 수강신청에 성공한 인원의 학번을 한 줄에 1개씩 출력한다.
예제 입력 1
3 8
20103324
20133221
20133221
20093778
20140101
01234567
20093778
20103325
예제 출력 1
20103324
20133221
20140101
문제풀이
수강신청 부하 관리 시스템
- 중복된 경우 대기번호 밀려난다. => 이전꺼 지우고 다시 삽입하는 것으로 구현하자!
- 가장 앞에 있는 학생부터 수강 가능인원만큼 출력.
- 하지만, K(수강 가능인원)가 db의 데이터 수보다 클 수 있다.
=> 이런 경우에는 K번 반복하며 인덱스 접근했다가 인덱스에러를 만나게된다.. 내가 그랬다.
=> 출력할때 K가 딕셔너리(리스트로 변환된) 의 길이 보다 클 경우와 작을경우 나눠서 출력하기.
처음엔 이 핵심들을 가지고 해시맵을 활용해서 구현하였다.
하지만 시간초과가 나와 sys.stdin.readline()을 이용하였는데 출력형식이 잘못되었다고 떠서,
rstrip()을 깜빡했단걸 깨달았다.
다시 기억하자...
input()으로 입력 받을땐 괜찮으나,
sys.stdin.readline() 이용하여 입력 받을경우 개행문자도 같이 받는다는거
코드
# 수강신청 부하 관리 시스템
# - 중복된 경우 대기번호 밀려난다. => 이전꺼 지우고 다시 삽입하면 될듯?
# - 가장 앞에 있는 학생부터 수강 가능인원만큼 출력.
import sys
input = sys.stdin.readline
K, L = map(int, input().split())
db = {}
for _ in range(L):
student = input().rstrip()
# db에 학생데이터 없다면
if student not in db:
db[student] = 1
# 있다면 (버튼을 한번 더 누른 것이므로 맨뒤로 밀려남)
else:
del db[student]
db[student] = 1
dbArr = list(db)
if len(dbArr) < K:
for item in dbArr:
print(item)
else:
for i in range(K):
print(dbArr[i])
'알고리즘 > 백준' 카테고리의 다른 글
[백준 4963] 섬의 개수 (with Python / BFS) (0) | 2023.08.30 |
---|---|
[백준 16165] 걸그룹 마스터 준석이 (with Python / 해시테이블) (0) | 2023.08.29 |
[백준 9375] 패션왕 신해빈 (with Python / 해시테이블) (0) | 2023.08.28 |
[백준 1302] 베스트셀러 (with Python / 해시테이블) (0) | 2023.08.28 |
[백준 7785] 회사에 있는 사람 (with Python / 해시테이블) (0) | 2023.08.27 |