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.stream.Collectors;record Order(String city, String customer, long amount) {}record CityStat(String city, long count, long total, String top) {}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]); long t = Long.parseLong(first[1]); List<Order> orders = new ArrayList<>(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); orders.add(new Order(p[0], p[1], Long.parseLong(p[2]))); } // 걸러서(filter) → 도시로 묶고(groupingBy) → 묶음마다 셈하기 Map<String, List<Order>> byCity = orders.stream() .filter(o -> o.amount() >= t) .collect(Collectors.groupingBy(Order::city)); // HashMap: 차례가 정해져 있지 않다 List<CityStat> stats = byCity.entrySet().stream() .map(e -> new CityStat( e.getKey(), e.getValue().size(), e.getValue().stream().mapToLong(Order::amount).sum(), // mapToInt면 21억에서 넘친다 e.getValue().stream().max(Comparator.comparingLong(Order::amount)).get().customer())) .sorted(Comparator.comparingLong(CityStat::total).reversed().thenComparing(CityStat::city)) .toList(); StringBuilder out = new StringBuilder().append(stats.size()).append('\n'); for (CityStat s : stats) out.append(s.city()).append(' ').append(s.count()).append(' ').append(s.total()).append(' ').append(s.top()).append('\n'); System.out.print(out); }}
C#Main.cs · 41 行
using System;using System.Collections.Generic;using System.Linq;using System.Text;record Order(string City, string Customer, long Amount);class Program{ static void Main() { string[] first = Console.ReadLine().Trim().Split(' '); int n = int.Parse(first[0]); long t = long.Parse(first[1]); var orders = new List<Order>(); for (int i = 0; i < n; i++) { string[] p = Console.ReadLine().Trim().Split(' '); orders.Add(new Order(p[0], p[1], long.Parse(p[2]))); } // 걸러서(Where) → 도시로 묶고(GroupBy) → 묶음마다 셈하기(Select) → 정렬 var stats = orders .Where(o => o.Amount >= t) .GroupBy(o => o.City) // 처음 나온 차례로 묶음이 나온다 .Select(g => new { City = g.Key, Count = g.Count(), Total = g.Sum(o => o.Amount), // long이라 넘치지 않는다 Top = g.MaxBy(o => o.Amount)!.Customer, // 같으면 먼저 나온 것 }) .OrderByDescending(s => s.Total) .ThenBy(s => s.City, StringComparer.Ordinal) .ToList(); var sb = new StringBuilder().Append(stats.Count).Append('\n'); foreach (var s in stats) sb.Append($"{s.City} {s.Count} {s.Total} {s.Top}\n"); Console.Write(sb); }}