始まりと終わりを分けて要る部屋の数を数える

区間問題 161

研修の日程の並びから、同じ部屋で日が重ならないように割り当てるときに要る部屋の最少の数を求める。始まりの日と最終日を別々に並べて前から数えれば、同時に開いている研修の最大の数が分かります。

海外で定番の問題リスト 4 本には入っていません

問題

研修の日程が、[初日, 最終日] の組の並び plans で渡されます。日程は初日と最終日の両方を含み、研修は日程の間ずっと 1 つの部屋を使います。1 つの部屋で同じ日に 2 つの研修はできません。全部の研修に部屋を割り当てるとき、要る部屋の数の最少を返す関数を書いてください。

  • 片方の最終日と、もう片方の初日が同じ 2 つの研修は、その日に重なるので同じ部屋に入れられません
  • plans は並べ替えられていません
  • どの組も、初日は最終日以下です
  • plans の長さは 1 以上 100000 以下、値はどれも 1 以上 1000000 以下です

入力と出力の例

例 1

3 日目は [1, 5]、[2, 3]、[3, 7] の 3 つが開かれているので、部屋が 3 つ要ります。

plans = [[1, 5], [2, 3], [3, 7], [6, 9], [9, 10]]
3

例 2

どの 2 つも日が重ならないので、1 つの部屋で足ります。

plans = [[7, 9], [1, 3], [4, 6]]
1

例 3

6 日目に 2 つの研修が開かれるので、部屋は 2 つ要ります。

plans = [[2, 6], [6, 8]]
2

面接での聞かれ方

面接では、会議室の予約の話として出されることが多いです。

  • 「会議の時間帯の一覧があります。会議室はいくつあれば足りますか」
  • 「終わりと始まりが同じ会議は、同じ部屋で続けてできますか」と聞くと、場面によって答えが変わります。この問題では日の単位なので、同じ日は重なるとします
  • 書き終えたあとに「どの研修をどの部屋に入れるかも返してください」と、続きを聞かれることもあります

要る部屋の最少の数は、同じ日に開かれている研修の数の最大と同じです。言い換えてから考えると、方針が立てやすくなります。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def min_groups(plans: list[list[int]]) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(min_groups([[1, 5], [2, 3], [3, 7], [6, 9], [9, 10]]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します