Devlog_by_0giru

[프로그래머스] 프린터 본문

[PS]

[프로그래머스] 프린터

0giru_kim 2021. 5. 25. 11:25

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

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

레벨2 문제라고 쉽게 생각했다가 몇일동안이나 고민했다.

프린트 순서를 만지는 방법은 금세 떠올랐지만 코드로 구현하는 능력이 부족했다.

근처 난이도의 문제를 더 풀며 구현능력을 키워야 한다ㅠㅠ

 

두가지 방법을 풀 수 있었는데, 먼저 두 방법 모두 큐를 사용하기 위해 collection의 deque를 import 했다.

 

첫번 째 방법은 아래 코드블럭에서 주석처리한 방법이다.

입력으로 주어지는 priorities의 요소에 각 인덱스를 매핑해주는 mapping 함수를 만들었다.

큐에 주어진 priorities를 입력하고 popleft로 하나씩 빼주면서 q가 모두 빌 때까지 아래를 반복한다.

 

1. pop한 요소보다 우선순위가 큰 요소가 있을 경우 다시 q로 집어넣어준다.

2. pop한 요소보다 우선순위가 큰 요소가 없을 경우 result 리스트에 append한다.

 

큐가 모두 비워지고 result 함수가 완성되면, 입력조건에 주어진 location을 만족하는 요소를 찾아 인덱스를 리턴하면 된다.

반복문 제어를 위해 flag를 사용했는데, 의도한대로 동작은 했으나 코드의 작성이 어색하고 만족스럽지 못했다. 그래서 다른 사람의 풀이를 보니 파이썬 기본 라이브러리 함수 중 any()를 이용해 푼 풀이가 있어 참고해 다시 풀었다.

 

두번째 방법은 주석처리 하지 않은 any를 이용한 방법이다.

큐에 priorities 리스트를 옮겨준 것과 인덱스를 요소에 매핑해준 것은 동일하다. 단지 코드 리팩토링을 위해 함수로 만들지 않았다.

any함수는 리스트 중 조건을 만족하는 것이 한개라도 있으면 True를 반환해주는데, 이를 이용해 pop한 요소보다 큰 것이 있는지 검사하는 코드를 더 간단하게 작성할 수 있었다.

any와 함께 all 이라는 함수도 있는데, 이는 알아두면 굉장히 유용하게 쓸 수 있으므로 알아두는 것이 좋겠다.

 

from collections import deque

def solution(priorities, location):
    q = deque()
    count = 0
    
    for i in range(len(priorities)):
        priorities[i] = [priorities[i], i]
    
    for pri in priorities:
        q.append(pri)
    
    while q:
        temp = q.popleft()
        count += 1
        if any(temp[0] < temp2[0] for temp2 in q):
            q.append(temp)
            count -= 1
        else:
            if temp[1] == location:
                return count
                
# ==============================================================  

# def mapping(List : list):
#     result = list()
#     for i in range(len(List)):
#         result.append((List[i], i))
#     return result

# def search(List : list, loc):
#     for i in range(len(List)):
#         if List[i][1] == loc:
#             return i

# def solution(priorities, location):
#     flag = 0
#     q = deque()
#     temp_list = list()
#     result = list()
    
#     temp_list = mapping(priorities)
    
#     for temps in temp_list:
#         q.append(temps);
    
#     while q:
#         temp = q.popleft()
#         for i in q:
#             if i[0] > temp[0]:
#                 q.append(temp)
#                 flag = 1
#                 break
#         if flag == 1:
#             flag = 0
#             continue
#         else:
#             flag = 0
#             result.append(temp)
            
#     return search(result, location) + 1

'[PS]' 카테고리의 다른 글

[프로그래머스] H-index  (0) 2021.06.12
[프로그래머스] 주식 가격  (0) 2021.05.28
[프로그래머스] 카펫  (0) 2021.05.14
[프로그래머스] 타겟 넘버  (0) 2021.04.20
[프로그래머스] 소수 찾기  (0) 2021.04.04