코딩 기록소
반응형

문제

    • 기숙사에서 살고 있는 준규는 한 개의 멀티탭을 이용하고 있다. 준규는 키보드, 헤어드라이기, 핸드폰 충전기, 디지털 카메라 충전기 등 여러 개의 전기용품을 사용하면서 어쩔 수 없이 각종 전기용품의 플러그를 뺐다 꽂았다 하는 불편함을 겪고 있다. 그래서 준규는 자신의 생활 패턴을 분석하여, 자기가 사용하고 있는 전기용품의 사용순서를 알아내었고, 이를 기반으로 플러그를 빼는 횟수를 최소화하는 방법을 고안하여 보다 쾌적한 생활환경을 만들려고 한다.
  • 예를 들어 3구(구멍이 세 개 달린) 멀티탭을 쓸 때, 전기용품의 사용 순서가 아래와 같이 주어진다면,
  1. 키보드
  2. 헤어드라이기
  3. 핸드폰 충전기
  4. 디지털 카메라 충전기
  5. 키보드
  6. 헤어드라이기
    • 키보드, 헤어드라이기, 핸드폰 충전기의 플러그를 순서대로 멀티탭에 꽂은 다음 디지털 카메라 충전기 플러그를 꽂기 전에 핸드폰충전기 플러그를 빼는 것이 최적일 것이므로 플러그는 한 번만 빼면 된다. 

입력

  • 첫 줄에는 멀티탭 구멍의 개수 N (1 ≤ N ≤ 100)과 전기 용품의 총 사용횟수 K (1 ≤ K ≤ 100)가 정수로 주어진다. 두 번째 줄에는 전기용품의 이름이 K 이하의 자연수로 사용 순서대로 주어진다. 각 줄의 모든 정수 사이는 공백문자로 구분되어 있다. 
# Case 1
2 7
2 3 2 3 1 2 7

출력

# Case 1
2

내가 제출한 풀이 - 정답

import sys

n, k = list(map(int, sys.stdin.readline().strip().split()))
order = list(map(int, sys.stdin.readline().strip().split()))
res = 0
plug = []

for i in range(0, len(order)):
    if order[i] not in plug and len(plug) < n:
        plug.append(order[i])
    elif order[i] not in plug and len(plug) >= n:
        slice_list = order[i+1::]
        remove_item = plug[0]

        for j in range(0, len(plug)):
            # plug 안에 있는 제품이 order에서 더 이상 나오지 않는 경우
            if plug[j] not in slice_list:
                remove_item = plug[j]
                break
            else:
                remove_item = slice_list[max(remove_idx, slice_list.index(plug[j]))]

        plug.remove(remove_item)
        plug.append(order[i])
        res += 1

print(res)

문제 해설

이 문제에 대한 해결법은 다음과 같다.

  1. 멀티탭이 다 사용 중이지 않다면 전기용품을 꽂는다.
  2. 멀티탭이 다 사용 중이라면 플러그에서 하나를 빼고 꽂는다.
  3. 플러그를 하나 뺄 때는 꽂힌 전기용품 중 다음부터 사용할 예정이 없거나, 가장 뒤 늦게 사용되는 전기용품을 제거하면 된다.

 

if order[i] not in plug and len(plug) < n:
        plug.append(order[i])

사용할 전기용품이 멀티탭에 꽂혀있지 않고, 멀티탭에 플러그가 남아있다면 플러그를 꽂는다.

사용할 전기용품이 멀티탭에 꽂혀있는데 또 추가하게 되면 플러그가 중복으로 들어간다.

 

elif order[i] not in plug and len(plug) >= n:
    slice_list = order[i+1::]
    remove_item = plug[0]

slice_list를 통해 추가할 전기용품 + 1부터 전기용품 사용 목록을 잘라낸다.

 

for j in range(0, len(plug)):
    # plug 안에 있는 제품이 order에서 더 이상 나오지 않는 경우
    if plug[j] not in slice_list:
        remove_item = plug[j]
        break
    else:
        remove_item = slice_list[max(remove_idx, slice_list.index(plug[j]))]

    plug.remove(remove_item)
    plug.append(order[i])
    res += 1

플러그 중 하나가 slice_list에서 없다면 더 이상 사용할 필요가 없으므로, 제거를 한다.

만약, 모든 플러그들이 사용 예정에 있다면 플러그를 사용하고 있는 전기용품들 중 가장 뒤늦게 사용되는 요소를 찾는다.

 

plug.remove(remove_item)
plug.append(order[i])
res += 1

제거할 아이템을 찾았다면 remove()를 통해 제거 후 요소를 추가시켜준다.

반응형
profile

코딩 기록소

@seungyong20

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!