본문 바로가기

Python/코딩 테스트 해설집

프로그래머스 - 스택/큐 - 프린터[파이썬]

반응형

1. 문제의 출처 및 설명

2. 문제 풀이 

 

1. 문제의 출처 및 설명

 

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

 

 

(1) 문제의 설명

 

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

 

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.

2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다.

 

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

 

내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

 

 

 

 

2. 문제 풀이

 

(1) 내가 구성한 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def solution(priorities, location):
    
    ##문서에 고유한 번호를 부여하기 위한 작업
    temp_list = [str(i) for i in range(len(priorities))]
    basic = []
    
    ## 문서별로 고유한 번호와 우선순위를 하나의 tuple 형태
    for k, v in zip(priorities, temp_list):
        basic.append([k, v])
        
    ## 추출하고자 하는 문서. 이로서 사전작업은 끝
    goal = temp_list[location]
    print_cnt = 0
    
    while basic:    
        ## 최우선순위 업데이트
        most_important = max(  basic[i][0for i in range(len(basic)) )
        node = basic[0]
        ## 최우선 순위인데,  
        if node[0>= most_important:
            
            ## 내가 뽑고자 하는 문서라면
            if node[1== goal:
                print_cnt += 1
                basic.pop(0)
                break
                
            ## 내가 뽑고자하는 문서가 아니라면
            else:
                print_cnt += 1 ## 인쇄된 순서를 기록
                basic.pop(0## 인쇄된 데이터는 queue에서 삭제
                         
        ## 최우선 순위가 아니라면, 순서의 교체 작업
        else:
            temp = basic.pop(0)
            basic.append(temp)
            
    answer = print_cnt
    return answer
cs

 

1) zip의 활용

 

zip이란 두 가지 별도의 리스트를 하나의 형태로 전환하여 줍니다. 

 

이번 문제에서 zip 내장함수를 활용한 이유는 뽑고자 하는 문서에 고유한 번호를 부여하여, 100% 확실하게 데이터를 걸러주기 위해서 활용하였습니다. 

 

Zip의 활용 예시는 다음과 같습니다. 

 

zip 내장 함수 활용 방법

저는 이러한 데이터 형태를 nested list로 받아 문제 풀이 활용했습니다. 

 

 

 

(2) 모범 답안 해설

1
2
3
4
5
6
7
8
9
10
11
def solution(priorities, location):
    queue =  [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    while True:
        cur = queue.pop(0)
        if any(cur[1< q[1for q in queue):
            queue.append(cur)
        else:
            answer += 1
            if cur[0== location:
                return answer
cs

 

1) enumerate의 활용

 

enumerate라는 내장 함수는 리스트 인자와 그 순서까지 같이 반환해주는 아주 유용한 함수입니다. 

 

이 답안에서는 queue라는 리스트 자료에 한 번에 순서와 문서 정보를 입력하여, 아주 깔끔한 형태로 데이터를 준비했습니다. 

 

 

2) any()의 활용 

 

any(iterable) 함수는 인자로 받은 반복가능한 자료형(iterable)중 단 하나라도 참(True)이 있으면 참(True)를 반환하는 함수 입니다. 반대로 모든 요소가 거짓(False)인 경우에만 거짓(False)을 반환합니다.


여기서 any를 활용한 이유는 단 한계라도 우선순위가 상위인 것이 있다면, 그 뒤로 자료를 옮기려는 목적이 있기 때문이죠. 

 

이 any() 내장 함수의 활용을 통해 굉장히 코드가 단순 명확해져서 클래스가 높아졌습니다. 저도 이 부분은 잘 배운 것 같아요. 

 

 

 

 

 

 

 

(3) 정답인증

 

정답인증

 

반응형