본문 바로가기

Python 코딩테스트

[프로그래머스] 프린터

반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 풀이

같은 우선순위 일 때, 구별하기 위해 2차원 배열로 나누었다.

 

2차원 배열로 만들어 2번째 값을 location에 해당하는 값, 다시 말해 내가 알고자 하는 인쇄물에 체크하고 deque를 사용해 계속 돌려주었다.

 

우선순위에 밀리면 뒤로 밀어내고, 우선순위에 맞다면 내가 찾는 값인지 체크를 확인한다. 만약 체크가 

되어있지 않다면 빼내고 계속 돌린다.


정답 코드

from collections import deque

def solution(priorities, location):
    answer = 0

    point = deque(priorities)

    for i in range(len(priorities)):
        if i!=location:
            point.append((point.popleft(),0))
        else:
            point.append((point.popleft(),1))

    priorities.sort()
    
    while True:
        if priorities[-1] != point[0][0]:
            point.append(point.popleft())
        else:
            if point[0][1] == 1:
                answer+=1
                break
            else:
                priorities.pop()
                point.popleft()
                answer+=1
    
    return answer

다른 풀이

enumerate 함수를 사용해 더 간단하게 풀 수도 있다. 

enumerate 함수를 사용해서 (우선순위, 리스트의 인덱스)를 deque에 넣어준다.

 

*enumerate는 리스트의 원소에 순서값(우선순위)를 부여해줄 수 있는 함수이다.

 

우선순위가 제일 높은 원소는 뽑고, 높지 않다면 큐의 맨 끝자리에 다시 추가해준다.

만약 중요도가 제일 높고, 몇 번째로 인쇄되는지 알고싶은 위치의 원소가 뽑히게 된다면 break 후 

순서를 출력하면 된다.

from collections import deque

def solution(priorities, location):
    
    cnt = 0
    arr = []
    for i,v in enumerate(priorities):
        arr.append((i,v))
    print(arr)
    queue = deque(arr)
    
    while queue:
        x = queue.popleft()
        for i in range(0,len(queue)):
            if x[1] < queue[i][1]:
                queue.append(x)
                print(x)
                break
                
        else:
            cnt += 1
            if x[0] == location:
                return cnt
반응형