일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Spring Security
- Vue
- SWEA
- 프로그래머스
- 그래프 이론
- 문자열
- 스택
- 자료 구조
- 깊이 우선 탐색
- 프로젝트
- 소수 판정
- springboot
- 알고리즘
- 정보처리기사
- n과 m
- 배포
- JPA
- dfs
- 재귀
- 그래프 탐색
- 정수론
- 너비 우선 탐색
- 백트래킹
- DB
- 수학
- 다이나믹 프로그래밍
- MYSQL
- 브루트포스 알고리즘
- 구현
- 백준
- Today
- Total
영원히 남는 기록, 재밌게 쓰자
백준 [1966] 프린터 큐 본문
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net
처음 우선순위 큐를 사용해서 접근하려고 했으나 해결이 안되었다. 풀이 중 LinkedList를 큐처럼 사용하는 방법이 있었다.
Queue<> q = new LinkedList<>(); 가 아닌 LinkedList<> = new LinkedList<>(); 로 선언하면 큐처럼 add(), poll()을 할 수 있고 반복문으로 탐색이 가능하였다.
문제는 N개를 입력받는데 순서와 중요도가 존재한다. 중요도 값은 중복이 될 수 있다.
N과 함께 입력 받은 M은 현재 queue에서 몇 번째로 놓여있는지를 나타내는 인덱스가 있다.
출력되는 차례의 인덱스가 M이랑 같을 때 그 출력 순서를 구하는 문제이다.
풀이
처음 입력 받을 때 입력 순서와 순서에 해당하는 중요도를 저장할 Node라는 객체를 선언하였다.
1. 처음 큐에서 데이터를 뽑는다.
2. 해당 Node 중요도 보다 더 큰 중요도를 가지고 있는지 나머지 큐의 데이터를 돌면서 탐색한다.
2-1. 중요도가 더 큰 데이터가 나왔을 때
하나라도 큰 데이터가 있으면 현재 뽑힌 데이터는 다시 큐에 넣고 뽑힌 더 큰 데이터에 대해서 2번 탐색을 시작한다.
2-2. 해당 Node가 중요도가 가장 클 때
이 Node는 poll()을 하고 이 때 Node의 순서가 M과 같은지 검사하고 일치하면 출력 순서 번호를 출력한다.
3. 아니라면 1번부터 반복
전체 코드
package com.baekjoon.p1966;
import java.io.*;
import java.util.*;
public class Main {
static int ans;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int t = 0; t < T; t++) {
st = new StringTokenizer(br.readLine());
ans = 0;
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken()); // 뽑고자 하는 순서 번호
LinkedList<Node> q = new LinkedList<>(); // 큐처럼 활용할 리스트
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
q.add(new Node(i, Integer.parseInt(st.nextToken())));
}
while (!q.isEmpty()) {
Node target = q.poll();
boolean flag = true;
for (int i = 0; i < q.size(); i++) {
if (target.value < q.get(i).value) { // 큐에 더 큰 중요도가 존재하면
q.add(target); // 제일 뒤로 넣기
for (int j = 0; j < i; j++) { // 큰 중요도에 해당하는 큐만큼 뽑고 다시 넣기를 반복
q.add(q.poll());
}
flag = false;
break;
}
}
if (!flag) {
continue;
}
ans++;
if (target.rank == M) {
break;
}
}
sb.append(ans + "\n");
}
System.out.println(sb);
}
}
class Node {
int rank;
int value;
Node(int rank, int value) {
this.rank = rank;
this.value = value;
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 [15664] N과 M (10) (0) | 2024.05.17 |
---|---|
백준 [11403] 경로 찾기 (0) | 2024.04.29 |
백준 [9465] 스티커 (0) | 2024.03.22 |
백준 [1991] 트리 순회 (0) | 2024.03.21 |
백준 [15666] N과 M (12) (0) | 2024.03.20 |