4.6. Технологи хотят ещё одну фичу

Работа над заданием

Задание принимается автоматически после нажатия на кнопку «Задание готово»

Технологи «Удара легенд» очень довольны после запуска опции с поиском игроков из предыдущего модуля! На волне успеха они принесли ещё одну новую фичу. В игре, помимо лиг, доступны и гильдии, по которым также существуют свои таблицы лидеров. Технологи очень хотят, чтобы похожие по счёту игроки искались не только внутри лиг, но и внутри гильдий — вдруг игроки захотят вступить в гильдии с игроками с похожим счётом? Гипотеза странная, но стоит проверки.

Имея счёт игрока, нужно найти в таблице лидеров для гильдий игрока с таким же счётом и вернуть его название гильдии и место в гильдии.

Как и в случае с лигами, это «отсортированная матрица», только сортировка немного другая. Гильдии отсортированы сверху вниз по счёту самого «слабого» из их игроков. А внутри гильдии все игроки отсортированы по количеству очков, как и в прошлый раз. Важное уточнение: в отличие от лиг, в таблице лидеров для гильдий в каждой гильдии находится одинаковое количество участников, то есть матрица является прямоугольной. Чтобы нагляднее показать разницу между задачами, посмотрите на примерные данные, с которыми придётся работать (а заодно посмотрите на новую модель данных игроков в таблице):

[
  [
    {
      "login": "stypeano",
      "leaguePoints": 23,
      "guild": "seabass"
    },
    {
      "login": "rstrazir",
      "leaguePoints": 42,
      "guild": "seabass"
    }
  ],
  [
    {
      "login": "kinerber",
      "leaguePoints": 28,
      "guild": "goldfish"
    },
    {
      "login": "eridarma",
      "leaguePoints": 53,
      "guild": "goldfish"
    }
  ]
]

Для таких данных, если игрок набрал 53 очка, нам нужно вернуть объект:

{
  "guild": "goldfish",
  "placement": 1
}

placement здесь — положение игрока внутри своей гильдии.

То есть если мы разложим это в один массив, как хотели в прошлый раз, то бинарным поиском это не решить. Пожалуйста, решите эту задачу быстрее, чем за линейное (O(n*m)) время, используя парадигму «Разделяй и властвуй»!

Подсказка

Алгоритм, решающий эту задачу, похож на бинарный поиск, но отбрасывать из наших данных на каждом шаге мы сможем только одну четверть, а не половину. Попробуйте найти в тестовых данных какой-нибудь счёт и посмотреть, какую из сторон матрицы вы совсем не рассматриваете.

Можете использовать данные из этого раздела в качестве тестовых
[
  [
    {
      "login": "stypeano",
      "leaguePoints": 4,
      "guild": "seabass"
    },
    {
      "login": "rstrazir",
      "leaguePoints": 356,
      "guild": "seabass"
    },
    {
      "login": "cathead",
      "leaguePoints": 930,
      "guild": "seabass"
    },
    {
      "login": "cavernous",
      "leaguePoints": 1056,
      "guild": "seabass"
    }
  ],
  [
    {
      "login": "ConspiracyLil",
      "leaguePoints": 18,
      "guild": "goldfish"
    },
    {
      "login": "CzarStories",
      "leaguePoints": 568,
      "guild": "goldfish"
    },
    {
      "login": "GottaSaiyan",
      "leaguePoints": 931,
      "guild": "goldfish"
    },
    {
      "login": "Mountaintrid",
      "leaguePoints": 1130,
      "guild": "goldfish"
    }
  ],
  [
    {
      "login": "Rectionom",
      "leaguePoints": 42,
      "guild": "catfish"
    },
    {
      "login": "JoshChase",
      "leaguePoints": 931,
      "guild": "catfish"
    },
    {
      "login": "DreamLess",
      "leaguePoints": 956,
      "guild": "catfish"
    },
    {
      "login": "BlondiePlanet",
      "leaguePoints": 1045,
      "guild": "catfish"
    }
  ],
  [
    {
      "login": "Breakingbing",
      "leaguePoints": 64,
      "guild": "bream"
    },
    {
      "login": "Goldenelox",
      "leaguePoints": 932,
      "guild": "bream"
    },
    {
      "login": "SaiyanBroadway",
      "leaguePoints": 1432,
      "guild": "bream"
    },
    {
      "login": "BoostScooby",
      "leaguePoints": 1476,
      "guild": "bream"
    }
  ]
]