import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.TreeMap;import java.util.stream.Collectors;record Play(String stage, String player, int score) {}record Best(String player, int score) {}public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String[] first = in.readLine().trim().split(" "); int n = Integer.parseInt(first[0]), k = Integer.parseInt(first[1]); List<Play> plays = new ArrayList<>(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); plays.add(new Play(p[0], p[1], Integer.parseInt(p[2]))); } // 판으로 묶고(TreeMap: 판 이름 순서) → 판 안에서 선수마다 가장 높은 점수(toMap + Math::max) Map<String, Map<String, Integer>> best = plays.stream() .collect(Collectors.groupingBy(Play::stage, TreeMap::new, Collectors.toMap(Play::player, Play::score, Math::max))); StringBuilder out = new StringBuilder().append(best.size()).append('\n'); best.forEach((stage, players) -> { String top = players.entrySet().stream() .map(e -> new Best(e.getKey(), e.getValue())) .sorted(Comparator.comparingInt(Best::score).reversed() // 점수만 거꾸로 .thenComparing(Best::player)) // 이름은 그대로 .limit(k) .map(b -> b.player() + ":" + b.score()) .collect(Collectors.joining(" ")); out.append(stage).append(' ').append(players.size()).append(' ').append(top).append('\n'); }); System.out.print(out); }}
C#Main.cs · 42 行
using System;using System.Collections.Generic;using System.Linq;using System.Text;record Play(string Stage, string Player, int Score);class Program{ static void Main() { string[] first = Console.ReadLine()!.Trim().Split(' '); int n = int.Parse(first[0]), k = int.Parse(first[1]); var plays = new List<Play>(); for (int i = 0; i < n; i++) { string[] p = Console.ReadLine()!.Trim().Split(' '); plays.Add(new Play(p[0], p[1], int.Parse(p[2]))); } // 판으로 묶고 → 판 안에서 다시 선수로 묶어 가장 높은 점수 → 정렬해서 k명 var stages = plays .GroupBy(r => r.Stage) .OrderBy(g => g.Key, StringComparer.Ordinal) // 문화권 규칙이 아니라 코드 순서로 .Select(g => { var ranked = g .GroupBy(r => r.Player) .Select(pg => (Player: pg.Key, Best: pg.Max(r => r.Score))) .OrderByDescending(x => x.Best) .ThenBy(x => x.Player, StringComparer.Ordinal) .ToList(); return (Stage: g.Key, Players: ranked.Count, Top: ranked.Take(k).Select(x => $"{x.Player}:{x.Best}")); }) .ToList(); var sb = new StringBuilder().Append(stages.Count).Append('\n'); foreach (var s in stages) sb.Append(s.Stage).Append(' ').Append(s.Players).Append(' ').Append(string.Join(" ", s.Top)).Append('\n'); Console.Write(sb); }}