📃 문제
💡 문제풀이
배열을 두 가지 조건으로 내림차순 정렬하는 것이 이 문제의 핵심이다.
Comparator 객체를 사용하여 문제를 풀어보았다.
Comparator
Comparator 인터페이스는 Java에서 객체들을 서로 비교할 때 사용되는 메커니즘을 제공하는 인터페이스이다. 이를 통해 정렬이나 순서 지정을 수행할 수 있다.
구현 방법
1. Comparator 객체 생성:
- 다중 조건으로 비교할 Comparator 객체를 생성한다.
- compare 메서드를 오버라이드하여 두 객체를 비교하고, 비교 결과에 따라 음수, 0, 양수 값을 반환하도록 구현한다.
- compare 메서드 작성법:
- 음수: 첫 번째 객체 < 두 번째 객체
- 0: 첫 번째 객체 == 두 번째 객체
- 양수: 첫 번째 객체 > 두 번째 객체
- 양수인 경우에 두 객체의 자리가 변경된다.
- 내림차순 정렬: Integer.compare(y, x)
- compare 메서드 작성법:
2. 배열 생성 및 데이터 입력:
- 정렬할 데이터를 저장할 2차원 배열을 생성한다.
- 데이터를 입력하면서 각 요소에 해당하는 조건들을 계산하여 저장한다.
3. 배열 정렬:
- Arrays.sort() 메서드를 사용하여 생성한 Comparator 객체를 전달하여 배열을 정렬한다.
- 정렬은 Comparator 객체의 비교 규칙에 따라 수행된다.
4. 정렬된 데이터 출력:
- 정렬된 배열에서 원하는 위치의 데이터를 출력한다.
💻 제출코드
import java.io.*;
import java.util.*;
public class Main {
// 다중 조건을 기준으로 내림차순 정렬하는 Comparator 객체
static Comparator<int[]> comparator = new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// 1의 개수를 기준으로 내림차순 정렬
int cmp = Integer.compare(o2[1], o1[1]);
if (cmp != 0) {
return cmp;
}
// 1의 개수가 같다면, 원래 10진수를 기준으로 내림차순 정렬
return Integer.compare(o2[0], o1[0]);
}
};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 정수의 수
int K = Integer.parseInt(st.nextToken()); // 찾으려는 정수의 위치
int[][] arr = new int[N][2];
st = new StringTokenizer(br.readLine());
int i = 0;
while (st.hasMoreTokens()) {
int n = Integer.parseInt(st.nextToken());
arr[i][0] = n; // 정수 값
arr[i][1] = Integer.toBinaryString(n).length()
- Integer.toBinaryString(n).replace("1", "").length(); // 1의 개수
i++;
}
Arrays.sort(arr, comparator); // 다중 조건으로 배열 정렬
System.out.println(arr[K - 1][0]); // 정렬된 배열에서 K-1번째 원소의 정수 값을 출력
}
}
💭 후기
이번 주는 시작이라서 그런지 문제들의 난이도가 쉬운 편이었다. 다음 주는 완탐문제인데 기대된다. 이번 주 챌린지 완료!