[BOJ 길라잡이/Java] 11일차 #1966 프린터 큐

2025. 3. 23. 14:16· Languages/Java
목차
  1. 알고리즘 분류
  2. Queue<Integer> 와 LinkedList<int[]> 사용 차이

알고리즘 분류

- 구현

- 자료 구조

- 시뮬레이션

- 큐

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

 

내가 찾고자 하는 문서가 몇 번째로 인쇄되는지 출력하는 문제다.

프린터기는 다음과 같이 동작한다.

1. 현재 Queue의 가장 앞에 있는 문서의 '중요도'를 확인한다.

2. 나머지 문서들을 돌며 현재 문서보다 중요도가 높으면, 현재 문서를 Queue의 가장 뒤로 이동시킨다.

3. 현재 문서가 가장 중요도가 높은 문서라면 인쇄한다.

4. 인쇄하는 문서가 내가 찾고자 하는 문서라면 중단하고 몇 번째 인쇄인지 출력한다.

 

처음에 생각한 방법은

내림차순 정렬을 해서 찾는 거였는데, Queue의 특성을 사용하기도 어렵고,

예외사항이 너무 많아서 생각하다가 중단했다..

 

찾아보니 Queue를 LinkedList로 구현해서 최초 순서와 중요도를 저장하는 방법이 있었다.

- 문서마다 [index, priority] 형식으로 큐에 저장한다.

- 가장 앞에 있는 문서를 꺼낸다.

- 꺼낸 문서보다 더 높은 중요도를 가진 문서가 큐 안에 있다면 꺼낸 문서를 큐의 맨 뒤로

- 아니라면 그 문서를 출력하면서 count++ 한다.

- 내가 찾고자 하는 문서라면 몇 번째 출력인지 count를 출력한다.

 

import java.io.*;
import java.util.*;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < T; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());

            LinkedList<int[]> q = new LinkedList<>();
            
            StringTokenizer st2 = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                // {초기 위치, 중요도}
                q.add(new int[] {j, Integer.parseInt(st2.nextToken())});
            }

            int count = 0;

            while (!q.isEmpty()) {
                int[] front = q.poll(); // 가장 앞에 있는 원소
                boolean isMax = true; // front 원소가 가장 큰 원소인지 판단

                for (int j = 0; j < q.size(); j++) {
                    if (front[1] < q.get(j)[1]) { // 중요도 비교
                        q.add(front); // 뽑은 원소를 뒤로 보낸다

                        for (int k = 0; k < j; k++) {
                            q.add(q.poll()); // j이전의 원소들도 뒤로 보낸다
                        }

                        // front가 가장 큰 원소가 아니었음 -> false
                        isMax = false;
                        break;
                    }
                }
                // front가 가장 큰 원소가 아니므로 다음 반복문으로 넘어감
                if (check == false) continue;

                // front가 가장 큰 원소이므로 출력
                count++;
                if (temp[0] == M) break; // 찾고자 하는 문서라면 테스트케이스 종료
            }

            sb.append(count).append("\n");

        }

        System.out.println(sb);
    }
}

 

Queue<Integer> 와 LinkedList<int[]> 사용 차이

내가 여태까지 사용해봤던 방식은

Queue<Integer> q = new LinkedList<>();

이렇게 선언하는 방식이었다.

이때 Queue는 인터페이스, LinkedList는 여러 구현 클래스 중 하나다.

이렇게 쓰면 큐처럼만 사용할 수 있다.

 

add() / offer() : 뒤에 추가

poll() : 앞에서 제거

peek() : 앞에서 보기

그런데 get(index) 같은 메서드는 사용할 수 없다. index를 따로 저장해둘 수 없기 때문이다.

 

오늘처럼

LinkedList<int[]> q = new LinkedList<>();

이렇게 사용하면 큐처럼도, 리스트처럼도 쓸 수 있다.

 

get(index) - 인덱스로 접근

add(index, value) - 중간에 삽입

remove(index) - 특정 위치 제거

이런 메서드들을 추가로 사용할 수 있다.

 

'Languages > Java' 카테고리의 다른 글

[BOJ 길라잡이/Java] 11일차 #5430 AC  (0) 2025.03.23
[BOJ 길라잡이/Java] 10일차 #1158 요세푸스 문제  (0) 2025.03.23
[BOJ 길라잡이/Java] 9일차 #1874 스택 수열  (0) 2025.03.21
[BOJ 길라잡이/Java] 8일차 #9012 괄호  (0) 2025.03.19
[BOJ 길라잡이/Java] 8일차 #10816 숫자 카드 2  (0) 2025.03.18
  1. 알고리즘 분류
  2. Queue<Integer> 와 LinkedList<int[]> 사용 차이
'Languages/Java' 카테고리의 다른 글
  • [BOJ 길라잡이/Java] 11일차 #5430 AC
  • [BOJ 길라잡이/Java] 10일차 #1158 요세푸스 문제
  • [BOJ 길라잡이/Java] 9일차 #1874 스택 수열
  • [BOJ 길라잡이/Java] 8일차 #9012 괄호
효딩
효딩
개ㄱ발은 기세다. 줄여서 객기.
효딩
hyoding
효딩
전체
오늘
어제
  • 분류 전체보기 (245)
    • SKKU SW (30)
      • Computer Architecture (14)
      • Database (4)
      • Computer Network (3)
      • Operating System (7)
      • Mobile App Programming (2)
    • SuperCoding (68)
    • CS (8)
    • Web Programming (19)
    • Cloud (13)
    • Languages (45)
      • Python (8)
      • Java (37)
    • Supporters (8)
      • MoteMote (6)
      • NHN Cloud (2)
    • Certification (27)
      • Network Advisor (14)
      • ADsP (10)
      • Engineer Information Proces.. (3)
    • Finance (9)
      • 경제금융용어 (3)
    • Woori FISA (14)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 네트워크관리사2급
  • 클라우드
  • 네트워크관리사 커트라인
  • 글로벌소프트웨어캠퍼스
  • 우리FISA
  • 코틀린
  • 네트워크관리사 후기
  • 클라우드 서비스
  • 네트워크관리사2급 필기
  • 네트워크관리사 합격
  • K-디지털트레이닝
  • rds local 접속
  • 앱개발
  • 서버개발
  • 우리에프아이에스
  • 네트워크관리사
  • 서버배포
  • nhn cloud
  • 우리fis아카데미
  • 서버생성
  • 클라우드서비스개발
  • Kotlin
  • 인프라
  • 네트워크관리사2급 공부방법
  • 인프라개발
  • apppaas
  • 네트워크관리사 준비물
  • AWS
  • 봐
  • 코틀린문법

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
효딩
[BOJ 길라잡이/Java] 11일차 #1966 프린터 큐
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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