[알고리즘/파이썬] 프로그래머스 - 프린터

Song·2021년 7월 7일
0

알고리즘

목록 보기
16/22

문제링크

문제 설명

인쇄 대기 목록에 있는 n개의 문서에는 각각의 중요도가 있는데, 해당 문서들은 목록 순서에 맞춰 순차적으로 인쇄되는 것이 아닌 중요도 기준으로 인쇄 순서가 정해진다. 이때, 내가 요청한 문서는 몇번째로 인쇄되는 지 알아보자.

주제

난이도

  • level 2

풀이 전 생각

선형 큐 처럼 원하는 값이 나올 때까지 값의 위치를 오른쪽에서 왼쪽으로, 왼쪽에서 오른쪽으로 계속 이동하다가
원하는 값이 나올 때 leftpop()를 진행하므로서 큐에 값이 없을 때까지 반복하자.

풀이

몇 번째인지 순서를 할당할 수 있는 변수 선언

 count = 0   

큐 안의 값이 없을 때까지 while문을 통해 반복

 while (priorities):

아래와 같이 크게 두가지 경우로 진행된다.

  • case 1: 출력해야하는 값이 맨 앞 (0번째)에 있을 시
  if location == 0:   
           # case 1_1 : 맨 앞에 있는 값보다 우선 순위가 높은 값이 있을 시
            if priorities[0] < max(priorities):
            # case 1_2 : 더 이상의 우선순위 숫자가 없고 요청한 숫자가 0번째에 위치했을 시
            else:
  • case 2: 출력해야하는 값이 맨 앞이 아닌 다른 위치에 있을 시
else:
        # case 2_1 :우선 순위 값이 0번째 위치에는 없지만 존재할 때
	if priorities[0] < max(priorities):   
        # case 2_1 : 우선 순위 값이 0번째에 존재 시
    	else:       	   

전체 코드

def solution(priorities, location):
    count = 0    
    while (priorities):
        # for priority in priorities:
        if location == 0:   # 출력해야하는 값이 맨 앞 (0번째)에 있을 시
            if priorities[0] < max(priorities):  # 우선 순위가 높은 숫자가 있는지 확인하고
                priorities.append(priorities.pop(0)) # 더 높은 숫자가 있을 시 마지막으로 보낸다.
                location = len(priorities) - 1  # 위치값은 0번째에서 마지막으로 바꿔준다. 
            else:   # 더 이상의 우선순위 숫자가 없고 요청한 숫자가 0번째에 위치했다면 요청한 숫자를 뽑을 차례이므로 while문을 종료하고 count 변수를 반환한다.
                return count + 1
        else:
            if priorities[0] < max(priorities):  # 우선 순위 값이 0번째 위치에는 없지만 존재할 때
                priorities.append(priorities.pop(0))   # 0번째 배열은 뒤로 보내주고
            else:
                priorities.pop(0) # 우선 순위 값이 0번째에 존재 시 큐에서 제거
                count += 1 
            location -= 1       # 출력해야하는 값은 앞으로 밀려났으니 위치값에 -1를 해준다.
    return count

풀이 방법

  1. 대기 목록(큐) 에 문서가 없어질 때까지 반복
  2. 만약 맨 앞에 있는 문서보다 우선 순위 문서가 존재한다면 해당 문서는 맨 뒤로 보낸다.
  3. 우선 순위 문서가 맨 앞에 온다면 대기 목록에서 제거
  4. 요청 문서가 맨 앞(0 번째)에 오고 다른 우선 순위 문서가 없어질 때까지 2,3번을 반복한다.

문제를 풀고 알게된 개념 및 소감

  • 어떻게 구현해야할 지 감은 잡았지만 실제로 코드까지 짜기에는 혼자 힘으로 무리더라..
    그래서 결국 구글링의 도움을 받았는데, 그래도 블로그에 한줄 한줄씩 정리해보니 이해는 된거같다.
    알고리즘같이 정말 짧은 시간에 습득한 지식은 쉽게 휘발되기에 꾸준함이 답인데 과제 핑계되며 계속 회피해왔던거같다. 매일 풀지는 못하더라도..2,3일에 한번씩은 문제를 풀도록 나 자신을 조금 더 채찍질해야겠다.
profile
Learn From Yesterday, Live Today, Hope for Tomorrow

0개의 댓글