-

세그먼트 트리 :: 백준 :: 최소값과 최대값 :: 2357 본문

알고리즘/세그먼트 트리

세그먼트 트리 :: 백준 :: 최소값과 최대값 :: 2357

lingi04 2017. 1. 3. 15:43



세그먼트트리를 활용하여 푸는 문제이다.

세그먼트트리를 모른다면 구글을 활용해 검색해보자. 자세한 설명들이 많이 올라와있다.


[문제 풀이]

먼저, 2열부터 11열까지 숫자를 입력받아 tree 배열에 집어넣는다. 인덱스를 신경써야 한다.

idx

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

75

30

100

38

50515220815X

X

XXXX


세그먼트 트리를 완성시키면 다음과 같은 모습이 된다.(문제는 최솟값, 최댓값을 구하라고 했지만, 편의상 지금은 최솟값만 구했다.)

idx

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

 

5

20

5

30

20

5

X

30

38

50

20

5

X

X

X

75

30

100

38

50515220815X

X

XXXX


이 상태에서 주어진 범위에 해당하는 최솟값을 찾는다.

예를 들어 두 번째 케이스인 3, 5의 경우

query(1, 16, 31, 18, 20)         L : 38    R : -1

L : query(2, 16, 23, 18, 20)            L : 38    R : 50

L : query(4, 16, 19, 18, 20)            L : -1    R : 38

L : query(8, 16, 17, 18, 20)

R : query(9, 18, 19, 18, 20)

R : query(5, 20, 23, 18, 20)            L : 50    R : -1

L : query(10, 20, 21, 18, 20)            L : 50    R : -1

L : query(20, 20, 20, 18, 20)

R : query(21, 21, 21, 18, 20)

R : query(11, 22, 23, 18, 20)

R : query(3, 24, 31, 18, 20)


위와 같은 과정으 거쳐 최솟값으로 38을 구할 수 있다.

최댓값 같은 경우는 살짝만 조작하면 바로 구할 수 있음!


사실 10868번 문제가 조금 더 기본문제라고 생각한다. 10868번 문제를 먼저 풀어보는 것이 이 문제를 푸는데 도움이 될 것이라 생각함.

Comments