티스토리 뷰

백준 2881 : 산책길

등급 : Gold III

2881번: 산책길 (acmicpc.net)

 

2881번: 산책길

정부는 오크 나무 숲을 통과하는 산책길를 만들려고 한다. 숲을 평면으로 나타낼 수 있고, 나무 N개는 평면위의 격자점으로 나타낼 수 있다. 산책길은 축에 평행한 직사각형으로 나타낸다. 산책

www.acmicpc.net

사용 알고리즘 : Binary Search

사용 자료구조 : Vector, Set, Map

 

이분 탐색의 upper_boundlower_bound를 이용하여 푸는 문제.

위의 그림에서 표시한 (2, 2) ~ (4, 4)의 경우, 경계에 존재하는 나무 3그루를 제거해야 한다.

이를 수행하려면 아래와 같은 과정이 필요하다.

 

  1) x가 2이면서 y가 2~4인 나무의 갯수 합

  2) x가 4이면서 y가 2~4인 나무의 갯수 합

  3) y가 2이면서 x가 2~4인 나무의 갯수 합

  4) y가 4이면서 x가 2~4인 나무의 갯수 합

  5) (2, 2)에 나무가 있는 경우 1개 감소 (1~4의 과정에서 꼭짓점은 두 번 더하게 되기 때문)

  6) (2, 4)에 나무가 있는 경우 1개 감소

  7) (4, 2)에 나무가 있는 경우 1개 감소

  8) (4, 4)에 나무가 있는 경우 1개 감소

 

이때 일반적인 배열로 이분 탐색을 하게 되면 범위 바깥의 나무도 더해지게 된다.

때문에 x좌표, y좌표에 따른 배열을 따로 생성해준다.

 

이를 토대로 이분 탐색(upper_bound, lower_bound)을 이용해 범위 내에 몇 개의 나무가 있는지 검사한다.

이후 꼭짓점의 좌표가 존재하는지 확인 후 갯수를 출력한다.

 

C++의 경우 내장된 upper_bound와 lower_bound, 그리고 set과 map의 기능으로 쉽게 풀이할 수 있지만,

Java의 경우 직접 구현해줘야 하며, contains 함수가 object의 경우 주소값으로 비교를 하기 때문에 이를 수정해줘야 한다.

 

cpp
코드 펼치기
java
코드 펼치기
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함