[백준 13334] 철로 (Kotlin)

2025. 9. 3. 13:51·Algorithm
🏆 문제 난이도
- Gold II

🔗 문제 링크
https://www.acmicpc.net/problem/13334

📝 문제 분석 & 접근

처음 문제를 접하면 모든 사람의 집과 회사 위치를 탐색해야 할 것 같아서 복잡하게 느껴질 수 있습니다.

하지만 잘 생각해 보면, 기차 경로는 시작점과 끝점 사이의 거리가 d 이하인 모든 구간을 의미합니다.

즉, [기차의 시작점, 기차의 시작점+d] 구간을 검사하면 되는 것입니다.

 

우리는 이 기차 구간 안에 최대한 많은 사람이 포함되도록 해야 합니다.

한 사람이 기차에 타려면, 그 사람의 집과 회사 위치가 모두 이 구간 안에 포함되어야 합니다.


✨ 핵심 아이디어

단순히 1부터 끝까지 모든 구간을 하나씩 검사하는 것은 오랜 시간이 걸립니다.

따라서 아래같은 약간의 트릭이 필요합니다.

 

  • 정렬 (Sorting)
    • 모든 사람의 집과 회사 위치 중 회사 위치 (to)를 기준으로 오름차순 정렬합니다.
    • 하단 코드의 list.sortBy { it.to } 이 부분이 이 아이디어에 해당됩니다.
    • 회사 위치로 정렬하는 이유는, 차의 끝 지점(오른쪽 끝)이 이 회사 위치에 맞춰서 순차적으로 이동한다고 생각하면 편하기 때문입니다.
    • 기차의 끝 지점이 오른쪽으로 쭉 움직이면서, 그 시점에 태울 수 있는 사람들을 확인하는 거라고 생각해도 됩니다.
  • 우선순위 큐 (Priority Queue)
    • 이제 기차의 끝 지점을 기준으로 사람들을 한 명씩 보면서, 현재 구간에 태울 수 있는 사람들을 PriorityQueue에 넣어 관리해줍니다.
    • PriorityQueue의 핵심은 가장 작은 값(집 위치)을 우선적으로 꺼내오도록 설정하는 겁니다.
    • 코드에서는 compareBy { it.from } 이 부분입니다.

 

코드 플로우를 글로 펼쳐보면,

 

  1. 회사 위치를 기준으로 정렬된 사람 리스트를 순회합니다.
  2. 각 사람을 순회할 때마다, 그 사람의 정보를 PriorityQueue에 추가합니다. 이 사람은 현재 기차의 끝 지점(자신의 회사 위치)에 포함될 자격이 생긴 거라고 생각하면 됩니다.
  3. PriorityQueue에 들어있는 사람들은 기차에 탈 가능성이 있는 사람들입니다. 하지만, 기차의 시작점(왼쪽 끝)은 현재 사람의 회사 위치 - d보다 작을 수 없습니다. 따라서 while(pq.peek().from < node.to - d) 코드를 통해 기차 구간을 벗어나는 사람들을 PriorityQueue에서 제거해줍니다.
  4. 이 과정을 거치면, PriorityQueue에는 현재 기차 구간 안에 포함된 사람들만 남게 되고, 이때 PriorityQueue의 크기(pq.size)가 현재 기차 구간에 탑승한 사람의 수가 됩니다. 이 값을 최대값(ans)과 비교하여 계속 갱신하면 됩니다.

 


💻 코드

import java.io.StreamTokenizer
import java.util.PriorityQueue
import kotlin.math.max

data class Node(
    var from: Int,
    var to: Int,
) {
    init {
        if (from > to) {
            from = to.also { to = from }
        }
    }
}

fun main() = with(StreamTokenizer(System.`in`.bufferedReader())) {
    fun StreamTokenizer.nextInt(): Int{
        nextToken()
        return nval.toInt()
    }

    val n = nextInt()
    val list = mutableListOf<Node>()
    repeat(n) {
        list.add(Node(nextInt(), nextInt()))
    }
    list.sortBy { it.to }

    val d = nextInt()

    val pq = PriorityQueue<Node>(compareBy { it.from })
    var ans = 0
    for(node in list) {
        pq.add(node)
        while(pq.isNotEmpty() && pq.peek().from < node.to - d) pq.poll()
        ans = max(ans, pq.size)
    }
    println(ans)
}

 

'Algorithm' 카테고리의 다른 글

[백준 2357] 최솟값과 최댓값 (Kotlin)  (0) 2025.09.06
[백준 15824] 너 봄에는 캡사이신이 맛있단다 (Kotlin)  (0) 2025.09.04
[백준 14725] 개미굴 (Kotlin)  (0) 2025.09.02
[백준 2533] 사회망 서비스(SNS) (Kotlin)  (0) 2025.09.01
[백준 2162] 선분 그룹 (Kotlin)  (1) 2025.08.31
'Algorithm' 카테고리의 다른 글
  • [백준 2357] 최솟값과 최댓값 (Kotlin)
  • [백준 15824] 너 봄에는 캡사이신이 맛있단다 (Kotlin)
  • [백준 14725] 개미굴 (Kotlin)
  • [백준 2533] 사회망 서비스(SNS) (Kotlin)
youngi2
youngi2
영기의 개발기록입니다!
  • youngi2
    영기의 개발일지
    youngi2
  • 전체
    오늘
    어제
    • 분류 전체보기 (15)
      • Algorithm (10)
      • Develop note (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Exceptino Factory
    유틸리티 클래스
    예외 팩토리 패턴
    7578 코틀린
    백준 7578 kotlin
    commit-msg
    예외팩토리
    백준 2618 코틀린
    Exception Factory Pattern
    백준 2618 kotlin
    백준
    utility class
    2618 코틀린
    GIT
    7578 kotlin
    백준 7578 코틀린
    예외팩토리패턴
    백준 7578
    유틸리티클래스
    2618 kotlin
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
youngi2
[백준 13334] 철로 (Kotlin)
상단으로

티스토리툴바