https://www.acmicpc.net/problem/13414
13414번: 수강신청
입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목
www.acmicpc.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import sys
input=sys.stdin.readline
k,l=map(int,input().rstrip().split())
d=dict()
d2=dict()
lst=[]
for i in range(l):
x = input().rstrip() # 학번은 문자열로
d[l-i]=x #학번이 중복되기 때문에 학번을 value로 받아줌.
d=dict(sorted(d.items()))
for key, val in d.items():
d2[val] = key #중복되는 데이터가 있을 때 앞에 데이터를 지워줌.
for key,val in d2.items():
lst.append(key)
lst.reverse()
lst=lst[:k]
for i in lst:
print(i)
|
cs |
이 문제는 딕셔너리를 이용해서 풀어봤는데,
처음 구현하고 싶었던 것은 {학번:(전체횟수-몇번째로 대기열에 들어왔는지)} 식으로 구성하고 싶었다.
하지만 키를 중복으로 넣는 것이 딕셔너리 상에서는 불가능 했다!!
예를 들면 20133221은 대기목록에 두번 들어가게 되므로 딕셔너리 상에 {20133221:6,20133221:5}
이런식으로 들어있어야 하는데 중복이 되므로 {20133221:5} 만 하고 뒤에 데이터는 없어지게 되었다.
그래서 키,값에 들어가야 할 데이터를 바꿨다 {(전체횟수-몇번째로 대기열에 들어왔는지):학번} 순으로!
d라는 딕셔너리를 sort해주면 반대로 정렬된 데이터들이 문제속 사진처럼 정렬되게 된다
d2[val]=key 를 이용해서 다시 {학번:(전체횟수-몇번째로 대기열에 들어왔는지)} 식으로 구성해준다
그리고 학번인 키 값만을 리스트 lst에 담아준다.
3명이 수강가능인원으로 슬라이싱을 통해 2번째 인덱스의 원소까지만 다시 lst에 담아주면 된다!
한달전 쯤 작성한 코드인데 지금 다시보니까 비효율적인게 너무 많은 것 같다. 그리고 사실 기억도 잘 안난다 ㅋㅋㅋ
만약 이 코드를 사용할 사람들이라면 8번째~12번째 코드를 좀 더 효율적으로 작성하는게 좋을 것 같다!!
(* 아 그리고 input 보다 sys.stdin.readline 꼭 하는게 좋다. 이 문제는 시간초과의 늪에 빠질 위험이 높기 때문에..!!)
'Python > 백준' 카테고리의 다른 글
[python 백준] 1236번 성 지키기 (0) | 2022.04.11 |
---|
댓글