도토리 줍는 개발자 김지무

프로그래머스 스택/큐 프린터 파이썬 - jimoo 본문

알고리즘공부

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

지무 2021. 9. 4. 02:24
728x90
반응형

프로그래머스 코딩테스트연습>스택/큐>프린터 풀이하도록 하겠습니다.

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

문제설명

일단 간단히 설명하자면, priorities 배열에서 우선순위가 높은 값을 가진 값부터 프린트를 해야한다.

문제의 본론은 priorities 배열에서 location에 해당하는 priority가 몇번째로 프린트 되는지 최종적으로 출력해야한다.

 

코드설명

문제를 읽어보면 배열의 첫번째에 위치하는 값이 배열의 다른 값(첫번째 값의 나머지) 보다 우선순위가 같거나 가장 높을 경우 프린트를 한다. 이는 스택의 FIFO의 특징을 가진다. (가장 먼저 들어온 값이 가장 먼저 out 될 수 있기 때문이다.) 따라서 스택구조로 코드를 짰다. 

 

location에 해당하는 priority의 프린트 순서를 출력해야하기 때문에 priorities의 위치를 저장해주었다.

(dics에 해당한다. 딕셔너리로 설명하자면 key=location, value=priority로 이해하면 된다.)

아래의 코드에 해당한다.

dics = list()

for i,p in enumerate(priorities):

     dics.append([i,p]) 

 

예제 1을 실행했을 경우 dics=[[0,2],[1,1],[2,3],[3,2]] 의 값을 가지게 된다.

 

이제 while문에 대해 설명을 하도록 하겠다.

while dics: 는 dics(큐)가 비어있지 않을 때까지 while문을 반복하겠다는 의미이다. 즉 프린트가 완료되었을 경우 while문을 반복하지 않겠다는 것이다. 

 

q = dics.pop(0)

코드를 통해 큐의 가장 앞에 위치해있는 값을 얻는다. 처음 while문을 실행했을 때 q는 [0,2] 값을 가지게 된다. 

따라서 q[0]은 priority의 location을 나타내고 q[1]은 priority를 나타낸다.

 

while문안에 있는 for문은 (--> for d in dics:)

dics.pop(0)을 통해 얻은 값이 나머지 큐에 존재하는 값보다 낮은 우선순위를 가질 경우,

프린트를 할 수 없기 때문에 큐의 마지막에 dics.append(q) 하는 코드이다. 

for 문으로 dics에 존재하는 모든 priorities의 값을 탐색할 수 있고

if(q[1]<d[1]):을 통해 우선순위가 더 큰 값이 존재하는지 확인할 수 있다.

 

만약 존재한다면 큐의 가장 마지막으로 이동시키고 더 이상 탐색할 필요가 없기때문에 break로 for문을 중단한다.

for문을 중단한 후 다시 while의 처음부분부터 시작해야하는데

이는 check 포인트인 chk변수를 통해 False인경우 continue를 통해 while문의 이후 코드를 실행하지 않고 다시 while의 처음부분으로 돌아가서 탐색할 수 있도록 하였다. 이는 if(q[1]<d[1])의 조건을 만족하는 경우에 해당한다.

 

그리고 if(q[1]<d[1])의 조건을 만족하지 않을 경우는 큐에서 우선순위가 가장 높거나 같은 경우를 나타낸다.

따라서 chk가 계속 True로 유지되어 if chk == Fasle 코드에 걸리지 않게되어 while문을 계속 실행할 수 있다. 

프린트를 할 수 있다는 뜻이기에 answer(프린트 순서)에 += 1을 해준다.

 

그리고 만약 q[0](location)이 원하는 location에 해당하는지 확인하고 확인한다면 모든 반복문을 break하고 answer을 리턴할 수 있도록 한다.

def solution(priorities, location):
    answer = 0
    dics = list()
    for i,p in enumerate(priorities):
        dics.append([i,p])

    while dics:
        chk = True
        q = dics.pop(0)
        for d in dics:
            if (q[1]<d[1]):
                dics.append(q)
                chk = False
                break
            
        if chk == False:
            continue
        answer += 1
        if q[0] == location:
            break
    return answer

테스트1~20 모두 통과한 결과를 볼 수 있다.

728x90
반응형
Comments