내가 생각했을때 문제에서 원하는부분
첫째 줄에 배열 A의 크기 N이 주어진다.
둘째 줄에는 배열 A의 원소가 0번부터 차례대로 주어진다.
N은 50보다 작거나 같은 자연수이고, 배열의 원소는 1,000보다 작거나 같은 자연수이다.
첫째 줄에 비내림차순으로 만드는 수열 P를 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader: br 객체를 사용하여 표준 입력을 읽는다.
N: 첫 번째 줄에서 배열의 크기 (N)을 읽어온다.
배열 선언: (A)와 (P)라는 두 개의 정수 배열을 선언한다.
(A)는 입력 배열, (P)는 최종 결과를 저장할 배열이다.
배열 A 입력
입력 처리: 두 번째 줄에서 배열 (A)의 원소를 한 줄로 읽어오고, 공백으로 나누어 문자열 배열로 변환한다.
정수 변환: 각 문자열을 정수로 변환하여 배열 (A)에 저장한다.
(값, 원래 인덱스) 쌍으로 저장
indexedA 배열: 각각의 원소와 그 인덱스를 쌍으로 저장하기 위해 2차원 배열 indexedA를 생성한다.
indexedA[i][0]는 값, indexedA[i][1]는 원래의 인덱스를 저장한다.
비내림차순으로 정렬
정렬: indexedA를 정렬한다.
값이 같은 경우 원래 인덱스를 기준으로 정렬하여 사전순으로 정렬된다.
Comparator: 사용자 정의 비교기를 사용하여 두 쌍을 비교한다.
P 배열 구성
P 배열 생성: 정렬된 indexedA를 바탕으로 (P) 배열을 구성한다.
정렬된 인덱스를 원래 위치에 할당하여 (P) 배열을 만든다.
P 배열 출력
StringBuilder: 결과를 출력하기 위해 StringBuilder를 사용하여 (P) 배열의 값을 문자열로 만든다.
출력: 최종적으로 (P) 배열을 공백으로 구분하여 출력한다.
코드로 구현
package baekjoon.baekjoon_25;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
// 백준 1015번 문제
public class Main862 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] A = new int[N];
int[] P = new int[N];
// 배열 A 입력
String[] input = br.readLine().split(" ");
for(int i = 0; i < N; i++) {
A[i] = Integer.parseInt(input[i]);
}
// (값, 원래 인덱스) 쌍으로 저장
Integer[][] indexedA = new Integer[N][2];
for(int i = 0; i < N; i++) {
indexedA[i][0] = A[i];
indexedA[i][1] = i;
}
// 비내림차순으로 정렬 (값 기준, 같으면 원래 인덱스 기준)
Arrays.sort(indexedA, new Comparator<Integer[]>() {
@Override
public int compare(Integer[] o1, Integer[] o2) {
if (o1[0].equals(o2[0])) {
return o1[1].compareTo(o2[1]);
}
return o1[0].compareTo(o2[0]);
}
});
// P 배열 구성
for(int i = 0; i < N; i++) {
P[indexedA[i][1]] = i;
}
// P 배열 출력
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
sb.append(P[i]).append(" ");
}
System.out.println(sb.toString().trim());
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.