https://www.acmicpc.net/problem/1700
1700번: 멀티탭 스케줄링
기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전
www.acmicpc.net
풀이
총 3가지 경우를 먼저 생각해 볼 수 있다.
1. 현재 꽂아야 할 용품이 멀티탭에 꽂혀 있는 경우
2. 멀티탭에 빈자리가 있을 경우
3. 멀티탭이 꽉 차있을 경우
이중 3번째의 경우 다시 2가지로 나누어 생각해 볼 수 있다.
3.1 멀티탭에 꽂혀있는 용품 중, 앞으로 꽂아야 할 용품 리스트에 없는 경우
3.2 만약 멀티탭에 꽂혀있는 용품들이 앞으로 모두 다시 꽂아야 할 경우
이렇게 보면 총 5가지로 볼 수 있다.
그러면 이 중 1, 2번은 멀티탭에서 용품을 뽑을 필요가 없기 때문에 cnt는 증가하지 않는다.
3.1번은 for문을 돌려 만약 멀티탭에 꽂혀있는 용품이 앞으로 꽂아야할 용품 리스트에 없다면
다시 꽂지 않아도 되기 때문에 해당 용품을 뽑은 후 현재 꽂아야 할 용품을 꽂는다.
이러면 1개를 뽑은 상황이기 때문에 cnt를 증가시켜준다.
3.2번은 꽂혀있는 용품이 모두 앞으로 꽂아야 할 리스트에 있으면 이 용품들을 언제 다시 꽂아야
하는지 확인 후 max값과 비교해서 크면 나중에 꽂아야 하는것이기 때문에 max에 대입해준다.
이렇게 for문이 모두 돌고 나면 가장 늦게 꽂아야 하는 용품을 뽑고 그 자리에 현재 꽂아야 하는
용품을 꽂고 cnt를 증가시켜준다.
여기에서 가장 늦게 뽑아야하는 용품을 뽑지않고 다른 용품을 뽑으면 그 용품을 다시 꽂았다가
또 뺄 경우가 생기기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
n,k=map(int, input().split())
arr=list(map(int,input().split()))
multi=[0]*n
cnt=0
while arr:
change=0
max=0
# 멀티탭에 현재 꽂아야하는 용품
x=arr[0]
#멀티탭에 x가 있으면 다시 꽂을 필요 없으니
#arr에서 x 제거(횟수는 늘어나지않음)
if x in multi:
arr.remove(x)
#멀티탭에 0이 있는 경우(0은 초기에 설정해놓은
#값이기 때문에 0이면 용품이 꽂혀있지 않은 상황)
#x를 멀티탭의 0이 있는 자리에 삽입
#arr에서 x 제거
elif 0 in multi:
multi[multi.index(x)]=x
arr.remove(x)
else:
#멀티탭이 꽉 차있는 경우
for i in multi:
#멀티탭에 꽂혀 있는 용품 i가 앞으로 꽂아야할
#리스트에 없는 경우 change에 i를 대입
#(i를 다시 꽂을 필요가 없기 때문에)
if i not in arr:
change=i
break
#멀티탭에 꽂혀있는 i가 앞으로 꽂아야할 리스트arr에
#있는 경우, 리스트에 있는 i의 인덱스(위치)가 크면
#나중에 꽂아야 해서 멀티탭에 있는 모든 i를 비교 후
#가장 큰 i를 제거(나머지는 가장 큰 i보다 먼저 다시
#꽂아야 하므로)
elif arr.index(i)>max:
change=i
max=arr.index(i)
multi[multi.index(change)]=x
arr.remove(x)
cnt+=1
print(cnt)
|
cs |
'Python3 > 백준 알고리즘' 카테고리의 다른 글
2022.02.15 [백준] (python 파이썬) 모두의 마블 (0) | 2022.02.15 |
---|---|
2022.02.14 [백준] (python 파이썬) 회의실 배정 (0) | 2022.02.14 |
2022.02.14 [백준] (python 파이썬) DNA (0) | 2022.02.14 |
2022.02.14 [백준] (python 파이썬) DFS와 BFS (0) | 2022.02.14 |
2022.02.14 [백준] (python 파이썬) 바이러스 (0) | 2022.02.14 |
댓글