반응형
https://www.acmicpc.net/problem/1966
문제풀이
//중요도에 해당하는 문서를 지우기 전까지는 루프돌기
이부분을 처음엔 importmant++로 두었을 때 테스트케이스가 잘 동작되어서 제출했는데
런타임 에러 (ArrayIndexOutOfBounds) 가 발생했다
디버그해보니 9까지인 중요도가 10, 11 로 올라가고있었다
count++로 고치니 잘 돌아간다!
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.Stack;
public class Main1966 {
/*
3 //테스트케이스의 수
1 0 //문서의개수, 출력순서가 궁금한 문서는 현재 큐의 0번째에 있다 (=5번문서)
5 //문서의 중요도
//결과 : 5번이 1번째로 출력되었으니 1
4 2 //문서의 개수, 출력순서가 궁금한 문서는 현재 큐의 2번째에 있다 (=3번문서)
1 2 3 4 //문서의 중요도 (최대값 4)
//문서 재배치 : 1, 2, 3, 4 -> //3번 현재 index는 2. 최대값이 3이 아니므로 index--;
2, 3, 4, 1 -> //3번 현재 index는 1. 최대값이 3이 아니므로 index--;
3, 4, 1, 2 -> //3번 현재 index는 0. index가 0인데 최대값이 3이 아니므로 index = queue.size-1;
4, 1, 2, 3 (4 출력) -> (최대값 3) //3번 현재 index는 3. 최대값이 3인데 index가 0이 아니면 index--;
1, 2, 3 -> //3번 현재 index는 2. 최대값이 3인데 index가 0이 아니면 index--;
2, 3, 1 -> //3번 현재 index는 1. 최대값이 3인데 index가 0이 아니면 index--;
3, 1, 2 (3 출력)... //3번 현재 index는 0. 최대값이 3인데 index가 0이면 result 출력
//결과 : 3번이 2번째로 출력되었으니 2
6 0 //문서의 개수, 출력순서가 궁금한 문서는 현재 큐의 0번째에 있다 (=1-1문서)
1 1 9 1 1 1 //문서의 중요도 (최대값 9) 구분을 위해 변경 : 1-1 1-2 9 1-3 1-4 1-5
//문서 재배치 : 1-1 1-2 9 1-3 1-4 1-5 -> //1-1번 현재 index는 0. index가 0인데 최대값이 1이 아니므로 index = queue.size-1;
1-2 9 1-3 1-4 1-5 1-1 -> //1-1번 현재 index는 5. 최대값이 1이 아니므로 index--;
9 1-3 1-4 1-5 1-1 1-2 (9출력) -> (최대값 1) //1-1번 현재 index는 4. 최대값이 1인데 index가 0이 아니면 index--;
1-3 1-4 1-5 1-1 1-2 (1-3출력) -> //1-1번 현재 index는 3. 최대값이 1인데 index가 0이 아니면 index--;
1-4 1-5 1-1 1-2 (1-4출력) -> //1-1번 현재 index는 2. 최대값이 1인데 index가 0이 아니면 index--;
1-5 1-1 1-2 (1-5출력) -> //1-1번 현재 index는 1. 최대값이 1인데 index가 0이 아니면 index--;
1-1 1-2 (1-1출력)... //1-1번 현재 index는 0. 최대값이 1인데 index가 0이면 result 출력
//결과 : 1-1번이 5번째로 출력되었으니 5
* */
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int testcaseCount = scanner.nextInt();
//테스트 케이스 수만큼 반복
for (int i = 0; i < testcaseCount; i++) {
int documentCount = scanner.nextInt();
int targetDocIndex = scanner.nextInt();
Queue<int[]> queue = new LinkedList<>();
//문서 위치, 중요도 배열에 저장
int[] importantArr = new int[9];
for (int j = 0; j < documentCount; j++) {
int important = scanner.nextInt();
queue.add(new int[]{ j, important });
//중요도 횟수 입력
importantArr[important-1] = importantArr[important-1] + 1;
}
int process = process(importantArr, queue, targetDocIndex);
System.out.println(process);
}
}
public static int process(int[] importantArr, Queue<int[]> queue, int targetDocIndex){
//몇번째 출력인지
int result = 0;
//System.out.println("중요도 등장횟수 : " + Arrays.toString(importantArr));
//중요도 높은 순서대로 반복
for (int important=9; important > 0; important--) {
//중요도 등장횟수만큼 반복
for (int count = importantArr[important-1]; count > 0; count--) {
//System.out.println("현재 중요도 : "+important + ", 등장횟수 : "+count + ", " + print(queue));
//현재 중요도와 문서의 중요도가 일치하면 remove
if(important == queue.peek()[1]){
result++;
//찾는 문서의 번호
if(targetDocIndex == queue.peek()[0]){
//System.out.println("*********** result : " + result);
return result;
}
queue.remove();
}else{ //현재 중요도와 문서의 중요도가 일치하지 않다면 뒤로 보내기
queue.add(queue.poll());
//중요도에 해당하는 문서를 지우기 전까지는 루프돌기
count++;
}
}
}
return 0;
}
public static String print(Queue<int[]> queue){
StringBuilder sb = new StringBuilder();
sb.append("queue : ");
for (int[] o : queue) {
sb.append(Arrays.toString(o)+", ");
}
return sb.toString();
}
}
package util;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class TestScanInput {
public static void ScanInput(String inputed){
InputStream in = new ByteArrayInputStream(inputed.getBytes());
System.setIn(in);
}
//이렇게 설정해두면 입력값을 정해놓고 테스트 돌릴 수 있다!! 훨씬 편리함
}
package baekjoon;
import org.junit.jupiter.api.Test;
import util.TestScanInput;
import java.io.IOException;
class Main1966Test {
@Test
void test1() throws IOException {
TestScanInput.ScanInput("3\n" +
"1 0\n" +
"5\n" +
"4 2\n" +
"1 2 3 4\n" +
"6 0\n" +
"1 1 9 1 1 1");
Main1966.main(new String[0]);
}
@Test
void test2() throws IOException {
TestScanInput.ScanInput("1\n" +
"6 3\n" +
"1 1 9 2 1 2");
Main1966.main(new String[0]);
/*
1-1 1-2 9 2-1 1-3 2-2
1-2 9 2-1 1-3 2-2 1-1
9 2-1 1-3 2-2 1-1 1-2
2-1 1-3 2-2 1-1 1-2
* */
}
@Test
void test3() throws IOException {
TestScanInput.ScanInput("1\n" +
"38 29\n" +
"7 1 8 4 7 1 3 4 6 5 7 8 3 2 8 5 9 4 6 8 2 1 8 7 4 8 5 3 7 6 3 4 6 1 5 2 8 5");
Main1966.main(new String[0]);
//정답 15
}
}
반응형
'Coding Test' 카테고리의 다른 글
[백준] 1012 유기농배추 자바 BFS, DFS (0) | 2022.02.21 |
---|---|
[백준] 1697 숨바꼭질 1차원 BFS (0) | 2022.02.12 |
[백준] 9012 괄호 (0) | 2022.02.11 |
[백준] 10828 스택 (배열, LinkedList로 구현해보기) (0) | 2022.02.10 |
[SWEA] 1206. [S/W 문제해결 기본] 1일차 - View (0) | 2022.02.10 |