[문제]
[내 코드] -> 틀렸습니다!!
N, K = map(int, input().split())
usage = list(map(int, input().split()))
plug = []
res = 0
for i in range(K):
if usage[i] in plug:
continue
elif len(plug) < N:
plug.append(usage[i])
else:
wait = []
for j in usage[i:]:
if j in plug:
wait.append(j)
if len(wait) == N:
break
if set(plug) - set(wait):
obj = (set(plug) - set(wait)).pop()
else:
obj = wait[-1]
plug[plug.index(obj)] = usage[i]
res += 1
print(res)
- 내가 생각해본 건, 이후 사용할 리스트에서 현재 플러그에 들어 있는 것들을 싹 다 리스트(wait)에 저장한 다음에 가장 나중에 사용하게 될 것을 플러그에 넣는 것이었다
- 그리고 이후 사용할 리스트에 현재 플러그에 끼워진 것이 없으면 그 중 하나를 뽑게 했다 (pop)
- 36% 정도 채점이 되다가 틀렸다고 떴다
- 될 듯하다가 말아버린.. 정답을 봐보았다
[개선안]
N, K = map(int, input().split())
scheduling = list(map(int, input().split()))
adaptor = [0] * N
count = 0
scheduling_idx = 0
tmp = 0
tmp_i = 0
for i in scheduling:
# 멀티탭에 같은 전기용품이 있을 때
if i in adaptor:
pass
# 멀티탭이 아직 채워지지 않았을 때
elif 0 in adaptor:
adaptor[adaptor.index(0)] = i
# 멀티탭에 빈자리 없고 현재 꽂혀 있는 전기용품들과 다를 때
else:
for j in adaptor:
# 현재 꽂혀있는 전기용품이 더 이상 사용되지 않는다면
if j not in scheduling[scheduling_idx:]:
tmp = j
break
#현재 꽂혀있는 전기용품이 이후에도 사용될 때
elif scheduling[scheduling_idx:].index(j) > tmp_i: # 꽂혀있는 것들 중 여러 개가 다시 사용될 때, 더 나중에 사용되는 것을 뽑는다.
tmp = j
tmp_i = scheduling[scheduling_idx:].index(j)
adaptor[adaptor.index(tmp)] = i
tmp = tmp_i = 0
count += 1
scheduling_idx += 1
print(count)
여기 아래 부분을 보면
elif scheduling[scheduling_idx:].index(j) > tmp_i: # 꽂혀있는 것들 중 여러 개가 다시 사용될 때, 더 나중에 사용되는 것을 뽑는다.
tmp = j
tmp_i = scheduling[scheduling_idx:].index(j)
이후에 사용할 물건 중(scheduling[idx:]) 현재 플러그에 꽂혀 있는 것 중(j) 가장 인덱스가 멀리에 있는 것을 찾는다
논리는 같은 것 같은데, 왜 내 코드는 안 되고 위 코드는 될까..
'컴퓨터 > 코딩테스트' 카테고리의 다른 글
[백준/약점체크] 1916번: 최소비용 구하기 (1) | 2022.10.03 |
---|---|
[백준/약점체크] 1806번: 부분합 (1) | 2022.09.25 |
[백준/약점체크] 1062번: 가르침 (1) | 2022.09.24 |
[백준/약점체크] 14719번: 빗물 (0) | 2022.09.18 |
[백준/약점체크] 2504번: 괄호의 값 (0) | 2022.09.18 |