최코딩의 개발

[백준 1966번] 프린터 큐 본문

코딩테스트/백준

[백준 1966번] 프린터 큐

seung_ho_choi.s 2025. 2. 8. 14:24
728x90

https://www.acmicpc.net/problem/1966

 

=begin
1. 입력을 받는다. data도 받아서 queue에 저장
1-1. data[0]은 중요도, data[1]은 순서
2. 중요도를 기점으로 배치를 해야된다. 비교를 하면서
2-1. 처음에 비교를 해야됨 만약에 뒤에값보다 작으면 삭제 아니면 냅둠
2-2. map 라이브러리로 ㄱㄱ
=end


T = gets.chomp.to_i
T.times do |i|
  # 입력
  input = gets.chomp.split.map(&:to_i)
  n = input[0]
  m = input[1]
  document = gets.chomp.split.map(&:to_i)

  queue = []
  document.each.with_index do |num, j|
    queue.push([num, j])  # 배열을 직접 생성
  end

  answer = []
  while !queue.empty?
    pData = queue.first
    max_priority = queue.map { |q| q[0] }.max  # 현재 큐에서 가장 높은 중요도 찾기

    if pData[0] < max_priority
      queue.push(queue.shift)  # 중요도가 낮으면 뒤로 보냄
    else
      answer.push(queue.shift)  # 중요도가 가장 크면 처리
    end
  end

  # 출력 (몇 번째로 출력되는지 찾기)
  answer.each.with_index do |data_ex, k|
    if data_ex[1] == m
      puts k + 1
      break
    end
  end
end

 

문제 이해는 쉬웠지만, 구현이 까다로웠다. 예전에 풀었던 백준의 탑 문제와 비슷한 느낌이 들었다.

이 문제의 핵심은 중요도를 기준으로 정렬하여 원하는 인덱스가 몇 번째로 출력되는지를 파악하는 것이다. 하지만 중요도를 판별하려면 if 문, cnt 등의 여러 변수를 고려하며 순환해야 한다.

처음에는 루비에서 이를 간단하게 해결할 수 있는 라이브러리가 있을 거라고 생각했다. 즉, 리스트에서 가장 큰 요소를 찾는 기능만 있으면 복잡한 알고리즘을 구현할 필요가 없을 것 같았다. 결국 해당 기능을 찾아 활용했고, 문제를 해결할 수 있었다.

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 1244번] 스위치 켜고 끄기  (0) 2025.02.10
[백준 2503번] 숫자 야구  (0) 2025.02.09
[백준 17413번] 단어 뒤집기 2  (0) 2025.02.08
[백준 10799번] 쇠막대기  (0) 2025.02.06
[백준 20437번] 문자열 게임 2  (0) 2025.02.03