[프로그래머스]프린터

Munang·2021년 8월 3일
0

알고리즘

목록 보기
4/26
post-custom-banner

난이도가 높은 문제는 아니었다. 하지만, 인덱스 문제가 있어서 난관이 있었던 문제 !

배열의 인덱스를 직접 조작하거나 확인 + 원소 자체를 삭제해야 하는 그런 로직이 있는 경우, 나만의 전략을 세웠다. 최대한 for루프는 지양해야 된다. 배열 자체의 원소도 변화하고 개수도 달라져서 무조건! 오류가 난다. 나는 이런 유형에 약한 것 같다.

  1. 다른 배열에 담아서 비교하기(인덱스 비교가 필요없을경우)
  2. 1번이 어려우면 while문으로 처리하되, 인덱스를 추적하는 변수를 따로 선언하기
  3. 튜플 형태로(원소, 인덱스)담아두기

이번 문제는 3번의 유형이었다.

처음의 나의 풀이(틀렸음)

from collections import deque

def solution(priorities, location):
    idx = -1
    cnt = 0
    n = len(priorities)
    while True:
        temp = priorities.pop(0)
        idx += 1

        if len(list(filter(lambda x: x > temp, priorities))) > 0:
            priorities.append(temp)

        else:
            cnt += 1
            if idx % n == location:
                return cnt

여기서 인덱스를 추적한다고 idx를 사용했는데, 이렇게 하면 원소가 pop될때마다 개수가 달라지기 때문에 결국에 내가 의도하던 값과 달라질 수 밖에 없다.

내가 의도한 로직대로 되려면, 중간에 pop되는 원소 없이 개수가 n개로 유지되어야 한다.

아무튼 그래서 블로그를 찾아본 결과 알아낸 풀이법.
애초에 그냥 인덱스를 담고 비교해보면 되는 문제였음.
데크에 대해서는 이전에 포스팅을 했기 때문에 별도의 포스팅 없이 넘어가도록 한다.

from collections import deque


def solution(priorities, location):
    d = deque([(v, i) for i, v in enumerate(priorities)])
    cnt = 0

    while True:
        temp = d.popleft()

        if len(list(filter(lambda x: x[0] > temp[0], d))) > 0:
            d.append(temp)
        else:
            cnt += 1
            if temp[1] == location:
                return cnt
post-custom-banner

0개의 댓글