반응형
백준 20551번 Sort 마스터 배지훈의 후계자
https://www.acmicpc.net/problem/20551
문제
지훈이는 Sort 마스터다. 오랫동안 Sort 마스터 자리를 지켜온 지훈이는 이제 마스터 자리를 후계자에게 물려주려고 한다. 수많은 제자들 중에 후계자를 고르기 위해서 지훈이는 제자들에게 문제를 준비했다.
먼저 제자들에게 N개의 원소를 가진 배열 A를 주고, A의 원소들이 오름차순으로 정렬된 배열B를 만들게 한다.
그다음 M개의 질문을 한다.
각 질문에는 정수 D가 주어진다. 제자들은 주어진 정수D가 B에서 가장 먼저 등장한 위치를 출력하면 된다.
단, D가 B에 존재하지 않는 경우에는 -1를 출력한다.
Sort 마스터의 자리를 너무나도 물려받고 싶은 창국이를 위해 지훈이의 문제를 풀 수 있는 프로그램을 만들어 주자.
입력
첫째 줄에 배열A의 원소의 개수 N과 질문의 개수 M이 공백으로 구분되어 주어진다.
다음 줄부터 N줄에 걸쳐 정수 이 주어진다.
다음 줄부터 M줄에 걸쳐 정수 D가 주어진다.
출력
M개의 질문에 대해서 주어진 D가 B에서 처음으로 등장한 위치를 출력한다.
단, 존재하지 않는다면 -1를 출력한다. (배열에서 가장 앞의 원소의 위치는 0이다.)
문제 유형
자료 구조 정렬 이분 탐색
풀이 방법 도출
- 정수 배열 A를 입력받고 오름차순으로 정렬하여 B 배열을 만듭니다.
- B 배열을 순회하면서 각 값이 처음 등장하는 위치를 Map에 저장합니다.
- 각 질문 D에 대해 Map에서 위치를 찾아 출력하고, 존재하지 않으면 -1을 출력합니다.
시간 복잡도
- 정렬: O(N log N)
- Map 저장: O(N)
- 질의 응답: O(M)
- 총 시간 복잡도: O(N log N + M)
핵심 코드 삽입 및 설명
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 배열 크기 N과 질문 수 M 입력
int N = scanner.nextInt();
int M = scanner.nextInt();
// 배열 A 입력
int[] A = new int[N];
for (int i = 0; i < N; i++) {
A[i] = scanner.nextInt();
}
// 배열 A를 정렬하여 B 생성
int[] B = Arrays.copyOf(A, N);
Arrays.sort(B);
// B에서 각 값의 첫 등장 인덱스를 저장할 Map 생성
Map<Integer, Integer> valueToIndex = new HashMap<>();
for (int i = 0; i < N; i++) {
// 처음 등장하는 값만 저장
if (!valueToIndex.containsKey(B[i])) {
valueToIndex.put(B[i], i);
}
}
// M개의 질문에 대해 위치 출력
for (int i = 0; i < M; i++) {
int D = scanner.nextInt();
// 존재하면 위치 출력
// 없으면 -1 출력
System.out.println(valueToIndex.getOrDefault(D, -1));
}
scanner.close();
}
}
반응형
'Study > 코딩 테스트' 카테고리의 다른 글
[99클럽 코테 스터디 TIL 26일차] 백준 4158번 CD 해설 및 풀이 (Java) (0) | 2025.04.25 |
---|---|
[LeetCode] 933. Number of Recent Calls 해설 및 풀이 (Python) (0) | 2025.04.25 |
[백준] 11399번 ATM 해설 및 풀이 (Python) (0) | 2025.04.24 |
[LeetCode] 1207. Unique Number of Occurrences 해설 및 풀이 (Python, Java) (0) | 2025.04.23 |
[99클럽 코테스터디 TIL 24일차] 백준 1590번 캠프가는 영식 해설 및 풀이 (Java) (0) | 2025.04.23 |