🔺 문제
10868번: 최솟값
N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을 때는
www.acmicpc.net
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import java.util.*;
import java.io.*;
public class Main {
static long[] tree;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// 트리 초기화
int treeHeight = 0;
int len = N;
while(len != 0) {
len /= 2;
treeHeight++;
}
int treeSize = (int) Math.pow(2, treeHeight + 1);
int leftNodeStartIdx = treeSize / 2 - 1;
// 트리 초기화
tree = new long[treeSize + 1];
for(int i = 0 ; i < tree.length ; i++) {
tree[i] = Integer.MAX_VALUE;
}
// 데이터 입력 받기
for(int i = leftNodeStartIdx + 1 ; i <= leftNodeStartIdx + N ; i++) {
tree[i] = Long.parseLong(br.readLine());
}
setTree(treeSize - 1); // 트리 생성
for(int i = 0 ; i < M ; i++) {
st = new StringTokenizer(br.readLine()," ");
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
s += leftNodeStartIdx;
e += leftNodeStartIdx;
System.out.println(getMin(s, e));
}
br.close();
}
// 범위의 최솟값 구하는 함수
private static long getMin(int s, int e) {
long Min = Long.MAX_VALUE;
while(s <= e) {
if(s % 2 == 1) {
Min = Math.min(Min, tree[s]);
s++;
}
s /= 2;
if(e % 2 == 0) {
Min = Math.min(Min, tree[e]);
e--;
}
e /= 2;
}
return Min;
}
// 초기 트리 생성 함수
private static void setTree(int i) {
while(i != 1) {
if(tree[i/2] > tree[i])
tree[i/2] = tree[i];
i--;
}
}
}
|
cs |
✅ 해결 아이디어
✔ 세그먼트 트리 - 최솟값 구하기
💥 유의사항
• ⇨ 트리 배열 크기를 minTree = new int[N * 4]
이렇게 해도 된다.
🔺 다른 풀이들
- 이게 정석적 풀이인 것 같다. 복습할 땐 이 코드 보고 해야겠다!
[BOJ] 백준 10868번 : 최솟값 (JAVA)
문제 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다. 하지만 이와 같은 a, b의 쌍이 M(1 ≤ M ≤ 100,000)개 주어졌을
steady-coding.tistory.com
- 책 설명대로 푸는 풀이
백준 10868번 최솟값 (JAVA)
백준 10868번 최솟값 https://www.acmicpc.net/problem/10868 10868번: 최솟값 N(1 ≤ N ≤ 100,000)개의 정수들이 있을 때, a번째 정수부터 b번째 정수까지 중에서 제일 작은 정수를 찾는 것은 어려운 일이 아니다.
lucysworld.tistory.com
- 트리 및 노드 클래스 만들어서 품
[JAVA] 백준 10868. 최솟값 (세그먼트 트리) :: 로직/코드 - GODZ
안녕하세요 GODZ입니다. 오늘은 세그먼트 트리를 이용한 문제를 풀어볼 예정입니다. 1. 문제 2. 입출력 예제 3. 개념 세그먼트 트리(Segment Tree)는 연속적인 여러 개의 데이터가 존재할 때, 특정 범위
godzz.tistory.com
💬 느낀 점
long형 인자들끼리 비교할 때는 Long.min()
써주면 되는구나!
책 풀이보다 다른 분들 풀이가 더 이해가 잘 되는 것 같다.
담엔 꼭 이렇게 풀어봐야지!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ DO it 알고리즘 코딩테스트 자바편
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 11437번: LCA (0) | 2023.05.10 |
---|---|
[백준/JAVA] 11505번: 구간 곱 구하기 (0) | 2023.05.09 |
[백준/JAVA] 2042번: 구간 합 구하기 (0) | 2023.05.09 |
[백준/JAVA] 1068번: 트리 (0) | 2023.05.07 |
[백준/JAVA] 11725번: 트리의 부모 찾기 (0) | 2023.05.06 |