내가 생각했을때 문제에서 원하는부분
첫 줄에 테스트 케이스의 수 P (1 ≤ P ≤ 1000) 가 주어진다.
각 테스트 케이스는 테스트 케이스 번호 T와 20개의 양의 정수가 공백으로 구분되어 주어진다.
20개의 정수는 줄서기를 할 아이들의 키를 줄서기 차례의 순서대로 밀리미터 단위로 나타낸 것이다.
모든 테스트 케이스는 독립적이다.
각각의 테스트 케이스에 대해 테스트 케이스의 번호와 학생들이 뒤로 물러난 걸음 수의 총합을 공백으로 구분하여 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리: BufferedReader를 사용하여 입력을 받는다.
첫 줄에 테스트 케이스 수를 읽고, 각 테스트 케이스마다 키를 읽는다.
줄서기 시뮬레이션: calculateStepsBack 메서드는 학생들이 줄을 서는 과정을 시뮬레이션한다.
각 학생의 키를 확인하고, 그 학생보다 큰 학생이 앞에 있는 경우, 그 만큼 학생들이 뒤로 물러나는 횟수를 계산한다.
출력 처리: 결과는 BufferedWriter를 사용하여 한 번에 출력한다.
코드로 구현
package baekjoon.baekjoon_27;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
// 백준 10431번 문제
public class Main976 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int P = Integer.parseInt(br.readLine().trim());
for(int i = 0; i < P; i++) {
String[] input = br.readLine().trim().split(" ");
int T = Integer.parseInt(input[0]);
int[] heights = new int[20];
for(int j = 0; j < 20; j++) {
heights[j] = Integer.parseInt(input[j + 1]);
}
int totalStepsBack = calculateStepsBack(heights);
bw.write(T + " " + totalStepsBack + "\n");
}
bw.flush();
bw.close();
br.close();
}
private static int calculateStepsBack(int[] heights) {
List<Integer> line = new ArrayList<>();
int stepsBack = 0;
for(int height : heights) {
int position = 0;
while(position < line.size() && line.get(position) < height) {
position++;
}
// 현재 키보다 큰 학생이 있는지 확인
if(position < line.size()) {
// 학생이 뒤로 물러나는 횟수
stepsBack += line.size() - position;
}
line.add(position, height);
}
return stepsBack;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.