Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Feb 27, 2025

🧷 문제 링크

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

🧭 풀이 시간

200분

👀 체감 난이도

✏️ 문제 설명

  • 1부터 100,000까지 번호가 붙은 여행지가 번호 순서대로 일렬로 나열되어 있고, 기차 한 대가 1번에서 출발하여 100,000번까지 운행된다.
  • 승객이 N명 있고, 각각 A[i]번 여행지에서 B[i]번 여행지까지 기차를 타고 가려 한다.
  • 기차 좌석의 수를 정해야 하는데, 두 가지 정책이 있다.

정책 1

  • 승객들은 임의의 순서대로 본인이 원하는 자리를 예약할 수 있다.

정책 2

  • 승객들은 본인이 원하는 자리를 예약할 수 없고, 대신 철도공사에서 정해준 자리에 앉아야 한다.

  • 두 정책에 필요한 좌석의 최소 개수를 각각 구해보자.

🔍 풀이 방법

[사용한 알고리즘]

  • 그리디 알고리즘
  • 정렬
  • 스위핑
  • policy-based data structure
  • 누적 합?

정책 2

  • 이건 단순히 각 사람을 여행지 번호 순대로 정렬시켜놓고, 부여해줄 수 있는 좌석 번호 중 제일 작은 값을 배정해주면 된다.
  • 구현하기 위해 set으로 사용 중인 좌석 번호들을 관리하며, 특정 사람에게 좌석을 부여할 때 set의 mex값을 구했다.

정책 1

  • 각 사람의 출발 여행지와 도착 여행지를 지금부터는 하나의 선분으로 생각한다.
  • 선분적어도 길이 1이상 걸쳐있는 선분의 개수가 곧 그 사람이 앉을 수 있는 좌석 번호 중 최댓값이다.
  • 승객들의 예약 순서가 무작위이기 때문에, 위의 값이 곧 worst case에서의 최소 좌석 수가 됨을 알 수 있다.
  • 각 선분 [s,e]에 대해 걸쳐있는 선분의 수를 구하는 방법은 다음과 같다.
  1. 시작 여행지가 s이상 e미만인 승객의 수
  2. 도착 여행지가 s초과 e이하인 승객의 수
  3. 시작 여행지와 도착 여행지가 모두 [s,e] 안에 포함된 승객의 수
  • (1) + (2) - (3)이 곧 그 선분에 걸쳐 있는 선분의 수가 된다.
  • (1), (2)는 세그먼트 트리로 구해줬지만, 지금 생각해보니 단순 누적 합으로도 가능하다.
  • (3) : 승객들을 미리 도착 여행지가 작은 순으로 정렬시켜놓고, policy-based data structure(pbds)를 이용해, pbds 내에 s이상의 원소 개수를 구한다.

  • 위 방법대로 각 선분에서의 걸친 개수를 세어주고, 그 중 최댓값을 구해준다.

⏳ 회고

  • 정책 2는 금방 해결했는데, 1이 너무 어려웠다...

@oncsr oncsr added success 👍 해설을 보지 않고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때 labels Feb 27, 2025
@ShinHeeEul ShinHeeEul merged commit e60779e into main Feb 27, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때 timeout ⌚ 목표 시간보다 오래걸렸을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants