알고리즘문제풀이

백준 31741 구간 덮기

배우겠습니다 2024. 4. 24. 00:03

문제

https://www.acmicpc.net/problem/31741

풀이

  • 쉬운 문제 가정

    • 2개만을 이용해 구간을 덮는 문제의 풀이
    1. 선분을 2개로 나눈다.
      a. 시작점이 S이하인 선분을 담는 배열 A
      b. 끝점이 E이상인 선분을 담는 배열 B
    2. A를 순회하며 B에서 이분 탐색으로 다음을 찾는다.
      • 이분 탐색을 위해 B를 시작점을 기준으로 정렬한다.
      • B의 시작점이 A의 끝점 이하인 선분 중 시작점이 제일 큰 선분 = B에서 시작점이 A 초과인 선분의 바로 전 인덱스 선분 찾기
    • 이를 통해 오차의 최솟 값을 구할 수 있다.
    • 이는 B를 순회하며 A에서 이분 탐색으로 A의 끝점이 B의 시작점 이상인 선분 중 끝점이 제일 작은 선분을 찾는 것으로도 풀 수 있다.
  • 원래 문제로 돌아가기

    1. 추가적인 선분 분류를 만든다.
      • 시작점이 S초과고 끝점이 E미만인 선분을 담는 배열 C
    2. C에서 쉬운 문제에서 가정한 두가지 풀이를 융합할 수 있지 않을까?
      • C는 사이에 있는 선분이므로 A의 끝점이 C의 시작점 이상인 선분 중 끝점이 제일 작은 선분 찾기
        • 이는 lower bound를 이용해 찾을 수 있다.
      • 마찬가지로 B의 시작점이 C의 끝점 이하인 선분 중 시작점이 제일 큰 선분 찾기
        • 이는 uppder bound를 이용한 뒤 찾은 인덱스를 1빼주면 된다.
      • 왜냐하면 C를 순회하며 C에서 현재 보고있는 선분을 기준으로 A와 B에서 오차가 제일 작은 선분을 찾는다면, A와 B사이의 오차 역시 최소이기 떄문이다.(0일수도 있다.)

'알고리즘문제풀이' 카테고리의 다른 글

백준 1633 최고의 팀 만들기  (1) 2024.05.14
백준 11834 홀짝  (0) 2024.05.14
백준 20500 Ezreal 여눈부터 가네 ㅈㅈ  (0) 2024.04.03
2381 최대거리  (1) 2024.03.24
31478 포니 양은 놀고 싶어  (2) 2024.03.22