본문 바로가기
프로그래밍/알고리즘 문제

[프로그래머스] 스택/큐 프린터문제 (Python)

by 잇서니 2019. 8. 18.
반응형

작성코드 (런타임에러 발생)

def solution(priorities, location):
    
    # (1) 필요한 변수 세팅
    print_list=[(p,i) for i,p in enumerate(priorities)]

    answer=0

    p_list=[p for p,i in print_list]
    p_max=max(p_list)
    
    # (2) 실제 로직 수행
    while True:
    	# (3) 현재 최상단큐의 중요도가 최대인 경우 출력함 (answer += 1) 
        if p_list[0] >= p_max:
            a=print_list.pop(0)
            p_list.pop(0)
            
            answer += 1
            p_max=max(p_list)
            
            # (3-1) 출력하는 문서가 내가 요청한 문서일 경우
            if a[1]==location:
                break
            
        # (4) 현재 최상단의큐의 중요도가 최대가 아닌 경우    
        else :
            a=print_list.pop(0)
            print_list.append(a)
            p_list.pop(0)
            p_list.append(a[0])
            
    return answer

 

코드설명

(1) 필요한 변수 세팅

print_list

  • priorities값과 인덱스를 함께 담은 변수입니다. 
  • 요청한 문서의 인덱스값을 판단할 때 사용하려고 합니다.
[(3,0),(2,1), (4,2),(1,3)]

p_list

  • print_list에서 priorities(중요도)만 담은 배열입니다.
  • 현재 큐(print_list)의 중요도 최대값을 구할 때 사용합니다.

p_max

  • 현재 큐(print_list)의 중요도 최대값을 구할 때 사용합니다.

answer

  • 몇번째로 출력됐는지에 대한 값입니다. (최종 결과값입니다.) 

 

(2) 실제 로직 수행

  • 반복문을 돌면서 현재 최상단큐의 중요도가 최대인지 아닌지 판별합니다.
  • 요청한 문서가 출력될 때까지 반복합니다. 
    • if a[1]==location 가 참일 때까지 반복하고 break로 반복문을 빠져나옵니다.

 

(3) 현재 최상단의 큐의 중요도가 최대인 경우 (출력함)

if p_list[0] >= p_max

a=print_list.pop(0)

  • 문서를 출력하기 위해 최상단 큐의 값을 빼냅니다.

p_list.pop(0)

  • 출력한 문서의 중요도 값도 빼냅니다.

answer += 1

  • 문서가 출력됐으니 출력 카운트 값을 1 증가시킵니다.

p_max=max(p_list)

  • 출력된 문서는 큐에서 빠져나갔으니 현재 큐에서 중요도 최대값을 다시 구합니다.

 

(3-1) 출력하는 문서가 내가 요청한 문서인 경우 (프로그램 완료!)

if a[1]==location :

  • 위에서 최상단 큐의 값을 변수 a에 담았습니다. (중요도값, 인덱스값)
  • a[1]은 최상단 큐의 값에서 인덱스값입니다. 이 값이 location의 값과 같은 경우, 출력하는 문서가 내가 요청한 문서라는 의미입니다.  
  • 내가 요청한 문서를 출력했으니 반복문을 종료해도 됩니다. break 명령으로 반복문을 종료합니다.

 

(4) 현재 최상단의 큐의 중요도가 최대가 아닌 경우 (반복문 다시 수행)

else :

  • p_list[0] < p_max 인 경우입니다. 
  • 현재 최상단의 큐의 중요도가 최대가 아니므로, 큐의 맨 뒤로 보내야 합니다.

a=print_list.pop(0)

  • pop 함수를 사용해서 현재 최상단의 큐를 우선 빼냅니다.

print_list.append(a)

  • 위에서 빼낸 값을 큐의 맨 뒤로 보내야 하므로 append 함수를 사용합니다.

p_list.pop(0) / p_list.append(a[0])

  • 중요도 값을 갖고 있는 p_list 큐도 최상단 값을 빼내고 맨 뒤로 보냅니다.

 

python 개념

  • 빠지는 구멍과 들어가는 구멍이 다릅니다.
  • pop(0) 함수를 사용해서 최상단의 큐의 값을 빼낼 수 있습니다.
  • append() 함수를 사용해서 큐의 맨 뒤에 값을 넣을 수 있습니다.

enumerate() 함수

  • 리스트나 튜플의 인덱스 값을 함께 출력해주는 함수입니다.
반응형

댓글