[BaekJoon] 2023/03/21

장세민·2023년 3월 21일
0

BaekJoon

목록 보기
4/6

11866번

이 문제를 풀기 위해 내가 생각한 알고리즘은 다음과 같다.

  1. N명과 기준이 되는 요소 K값을 입력받는다.
  2. 입력받은 K번째의 바로 앞까지의 요소를 popleft하고, 그 요소들을 append한다.
  3. 요소가 없어질 때까지 반복한다.

N = 7, k = 3이라면 1번부터 7번까지 사람 중 1번을 시작으로 3번째 순서에 있는 사람이 제거가 되고,
그 다음은 4부터 시작하여 다시 4를 기준으로 3번째 사람인 6이 제거가 된다.

K-1번째 까지의 사람들이 앞에서부터 제거가 된 후 다시 큐의 뒤로 돌아오며
K번째 사람은 완전히 제거가 되는 것이다.


from collections import deque

N, K = map(int, input().split())
que = deque([])

for i in range(1, N+1):
    que.append(i)

print('<', end = '')
while que:
    for i in range(K-1):
        que.append(que.popleft())
    print(que.popleft(), end='')
    if que:
        print(', ', end='')

print('>')



1966번

이 문제는 처음에 이해가 잘 안됐다.
m값이 의미하는 것이, 나열된 중요도에서 인쇄된 순서를 의미하는 줄 알고 한참 해맨거 같다..

코딩이 아닌 국어를 먼저 공부 해야할 것 같다.

문제에서 요구하는 바를 간략하게 설명하면 다음과 같다.

N개의 문서의 중요도와 프린터 인쇄 대기 순서를 줄테니 M번째 문서가 인쇄되는 순서를 구해봐라!


문제를 풀기 위해 내가 생각한 해결과정은 이렇다.

  1. 테스트 개수를 입력받는다.
  2. 테스트 개수만큼 n, m값, 중요도 값을 입력받는다.
  3. 중요도가 가장 높은 문서가 앞으로 가장 빠른 인쇄순서가 될 때까지 그 전 문서들을 후순위로 보낸다.

위 알고리즘으로 코드를 작성중에 문제가 생긴걸 깨달았는데,
m값은 몇 번째로 중요한 지가 아닌, 몇 번째로 인쇄되는 지 궁금한 문서의 index이므로
내가 생각한 방법으로 접근하면 틀린 값이 나올 수 밖에 없다.


문제는 알았지만, 어떻게 적용해야 하는 지 막막하던 중
m번째 문서를 표시할 수 있는 인덱싱을 추가하여 작성한 알고리즘을 찾을 수 있었다.

  1. 테스트 개수(t)를 입력받는다.
  2. t의 개수 만큼 n, m, 중요도를 입력받는다.
  3. 중요도 각각의 인덱스 번호를 붙이고, m번째 문서를 따로 지정한다.
  4. 중요도의 첫 번째 값이 최댓값이 될 떄까지 FIFO를 반복하고,
    첫번째 값이 최댓값이 되면 순서(order)를 하나씩 증가시킨다.
  5. 중요도의 순서가 바뀔때마다 인덱스의 순서도 같이 바꿔준다.
    그래야 m번째를 문서의 순서를 구할 수 있으므로!
t = int(input())

for _ in range(t):
    n, m = list(map(int, input().split()))
    important = list(map(int, input().split()))
    idx = list(range(len(important)))
    idx[m] = 'target'
    
    order = 0
    
    while True:
        if important[0] == max(important):
            order += 1
            
            if idx[0] == 'target':
                print(order)
                break
            else:
                important.pop(0)
                idx.pop(0)
                
        else:
            important.append(important.pop(0))
            idx.append(idx.pop(0))

한 걸음 나아가는데 도움을 준 깔끔한 풀이 해설

[백준] 1966번 프린터 큐 파이썬 풀이 - Be Geeky


다음엔 내 힘으로 이겨내보자!

profile
분석하는 남자 💻

0개의 댓글