Baekjoon/IM Level

[백준] 1966 프린터 큐 (실버3) / 큐

2023. 3. 25. 11:15

문제요약

나의 코드 및 설명

  • 우선순위가 높은 프린트물을 출력(popleft())하더라도 구하려고 하는 인덱스를 계속 추적함으로써 구하려고 하는 인덱스가 0에 위치해 있다면 반복문을 종료하는 코드를 작성하였다.
  • ans_idx : 먼저, 현재 입력받은 값에서, 구하려고 하는 인덱스 정보를 저장한다.
  • while문에서, 현재 큐 안에 우선순위가 가장 큰 인덱스를 찾아서 해당 요소를 큐의 맨 앞에 위치하도록 for문을 수행한다.
    for문을 수행했다면, 원래 찾으려고 했던 인덱스도 변화되었을 것이고, 어디에 있는지 찾아준다.
    만약 찾으려고 했던 인덱스가 맨 앞에 위치해 있다면 현재까지 프린트물을 몇 번 출력했는지 정보를 저장한 time을 출력하고 반복문을 탈출한다. 만약 찾으려고 했던 인덱스가 뒤에 위치해 있다면, 맨 앞의 프린트물을 출력하고, 찾으려던 인덱스 - 1 해준다.(인덱스 0 이 빠졌으므로)
from collections import deque
n = int(input())

for _ in range(n):
    page ,sequence = map(int,input().split())
    queue = deque(map(int, input().split()))

    #구하려고 하는 인덱스(pop() 메서드 따라 구하려는 인덱스도 변동되어야한다.)
    ans_idx = sequence 
    #몇 번째로 출력하는지 세기 위한 변수
    time = 1 
    while True:
        #현재 큐 중 우선순위가 가장 큰 인덱스를 구한다.
        max_idx = queue.index(max(queue)) # 3 # 2
        #우선순위가 가장 큰 인덱스의 이전 인덱스까지 popleft()를 통해 뒤에다 붙인다.
        # [1,2,3,4] -> [4,1,2,3]
        for _ in range(max_idx):
            queue.append(queue.popleft())
        #popleft()를 통해 요소의 위치가 변화가 일어남에 따라, 
        #원래 찾으려는 인덱스는 어디에 있는지 찾는다.
        ans_idx = (ans_idx + len(queue) - max_idx) % len(queue)
        #만약 찾으려는 인덱스의 위치가 현재 idx 0 에 있다면, 맨 앞에 있는 것이고
        #출력 순서가 된 것이므로 time을 출력하고 반복문을 탈출한다.
        if ans_idx == 0:
            print(time)
            break
        #찾으려는 인덱스의 위치가 idx 0 이 아니라면,
        else:
            #맨 앞에 있는(우선순위가 가장 높은) 프린트를 출력하고
            queue.popleft()
            #앞의 프린트가 출력이 되었으므로, 찾으려는 인덱스 위치는 한 칸 앞으로 간다.
            ans_idx -= 1
            #출력이 되었으므로 출력 횟수를 표시하는 변수인 time에 1을 더해준다.
            time+=1

피드백

1시간 10분 정도 걸려서 푼 것 같다. 자료구조 문제를 연습해보고 싶어서 풀어본 문제인데, 재밌게 풀었던 것 같다. 사실 풀 때에는 풀이 과정도 중구난방이었는데, 어? 이렇게 하면 되겠네? 를 반복하다가 비교적 깔끔하게 코드를 작성한 것 같다.

내 힘으로 문제를 해결해서 참 뿌듯하다. 그러나 시간 단축은 앞으로도 숙제인 것 같다. ㅠ

 

'Baekjoon > IM Level' 카테고리의 다른 글

[백준] 1931 회의실 배정 (실버1) / lambda(람다) : 익명함수  (0) 2023.03.26
[백준] 9012 괄호 (실버4) / 스택  (1) 2023.03.25
[백준] 11866 파이썬 (실버5) / 큐, replace() : 문자열을 변경하는 함수  (0) 2023.03.24
[백준] 10431 줄세우기 (실버5)  (0) 2023.03.24
[백준] 1158 요세푸스 문제 (실버4) / 큐  (0) 2023.03.24
'Baekjoon/IM Level' 카테고리의 다른 글
  • [백준] 1931 회의실 배정 (실버1) / lambda(람다) : 익명함수
  • [백준] 9012 괄호 (실버4) / 스택
  • [백준] 11866 파이썬 (실버5) / 큐, replace() : 문자열을 변경하는 함수
  • [백준] 10431 줄세우기 (실버5)
hellosonic
hellosonic
hellosonic
꾸준함
hellosonic
전체
오늘
어제
  • 분류 전체보기 (285)
    • SSAFY (4)
    • 프로그래머스 데브코스 (26)
    • Diary (1)
    • JavaScript (20)
    • ToyPJ (13)
      • Python-Django (13)
    • CS지식 (11)
      • 자료구조 (5)
      • 개발 상식 (2)
      • 네트워크 (4)
    • Baekjoon (141)
      • IM Level (57)
      • DFS와 BFS (21)
      • 백트래킹 (21)
      • DP (3)
      • 이분탐색 (4)
      • 구현 (14)
    • Programmers (13)
      • Lv1 (4)
      • Lv2 (9)
    • SWEA (SW Expert Academy) (52)
      • D1 (5)
      • D2 (7)
      • D3 (40)
    • 이코테 (4)
    • Grammar (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기
  • 관리자

공지사항

인기 글

태그

  • 백준 2999
  • SWEA 파이썬
  • 구현
  • javascript ux
  • SWEA D3
  • 프로그래머스
  • 프론트엔드 데브코스
  • SWEA
  • SWEA/D3
  • 파이썬 11478
  • 파이썬 1269
  • 자바스크립트
  • 리액트 todolist
  • 그리디
  • 파이썬 1436
  • 백준 18870
  • 백준 5212
  • 이코테
  • 파이썬
  • 백준
  • JS
  • 백준 14891
  • 파이썬 1946
  • 국비지원교육
  • 백준 1157
  • 자바스크립트 기본기
  • 프로그래머스 데브코스
  • 코딩부트캠프
  • SWEA D2
  • 파이썬 2529

최근 댓글

최근 글

hELLO · Designed By 정상우.
hellosonic
[백준] 1966 프린터 큐 (실버3) / 큐
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.