import sysfrom collections import namedtupleItem = namedtuple("Item", "name kind price")lines = sys.stdin.read().split("\n")n, q = map(int, lines[0].split())items = []for line in lines[1 : n + 1]: name, kind, price = line.split() items.append(Item(name, kind, int(price)))out = []for line in lines[n + 1 : n + 1 + q]: kind, limit, k = line.split() limit, k = int(limit), int(k) # 거르기: 목록 내포는 목록을 만들어 두므로 개수를 센 뒤에도 다시 쓸 수 있다 picked = [it for it in items if (kind == "*" or it.kind == kind) and it.price <= limit] # 정렬 → 앞에서 k개 → 이름만 top = [it.name for it in sorted(picked, key=lambda it: (it.price, it.name))[:k]] out.append(" ".join([str(len(picked))] + top))print("\n".join(out))
import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.stream.Collectors;public class Main { record Item(String name, String kind, long price) {} public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String[] first = in.readLine().trim().split(" "); int n = Integer.parseInt(first[0]), q = Integer.parseInt(first[1]); List<Item> items = new ArrayList<>(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); items.add(new Item(p[0], p[1], Long.parseLong(p[2]))); } Comparator<Item> byPriceThenName = Comparator.comparingLong(Item::price).thenComparing(Item::name); StringBuilder out = new StringBuilder(); for (int i = 0; i < q; i++) { String[] p = in.readLine().trim().split(" "); String kind = p[0]; long limit = Long.parseLong(p[1]); int k = Integer.parseInt(p[2]); // 스트림은 한 번만 흘려보낼 수 있다: 거른 결과를 목록으로 받아 두고 두 번 쓴다 List<Item> picked = items.stream() .filter(it -> (kind.equals("*") || it.kind().equals(kind)) && it.price() <= limit) .toList(); String top = picked.stream() .sorted(byPriceThenName) .limit(k) .map(it -> " " + it.name()) .collect(Collectors.joining()); out.append(picked.size()).append(top).append('\n'); } System.out.print(out); }}
C#Main.cs · 37 行
using System;using System.Collections.Generic;using System.Linq;using System.Text;record Item(string Name, string Kind, long Price);class Program{ static void Main() { int[] first = Console.ReadLine()!.Trim().Split(' ').Select(int.Parse).ToArray(); int n = first[0], q = first[1]; List<Item> items = Enumerable.Range(0, n) .Select(_ => Console.ReadLine()!.Trim().Split(' ')) .Select(p => new Item(p[0], p[1], long.Parse(p[2]))) .ToList(); var sb = new StringBuilder(); for (int i = 0; i < q; i++) { string[] p = Console.ReadLine()!.Trim().Split(' '); string kind = p[0]; long limit = long.Parse(p[1]); int k = int.Parse(p[2]); List<Item> picked = items .Where(it => (kind == "*" || it.Kind == kind) && it.Price <= limit) .ToList(); // ToList로 한 번 계산해 둔다(그냥 두면 쓸 때마다 다시 거른다) IEnumerable<string> top = picked .OrderBy(it => it.Price) .ThenBy(it => it.Name, StringComparer.Ordinal) // 두 번째 기준은 OrderBy가 아니라 ThenBy .Take(k) .Select(it => it.Name); sb.Append(string.Join(" ", top.Prepend(picked.Count.ToString()))).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 38 行
#include <algorithm>#include <iostream>#include <ranges>#include <string>#include <tuple>#include <vector>struct Item { std::string name, kind; long long price;};int main() { std::ios::sync_with_stdio(false); int n, q; std::cin >> n >> q; std::vector<Item> items(n); for (auto& it : items) std::cin >> it.name >> it.kind >> it.price; auto byPriceThenName = [](const Item& a, const Item& b) { return std::tie(a.price, a.name) < std::tie(b.price, b.name); }; for (int i = 0; i < q; i++) { std::string kind; long long limit; int k; std::cin >> kind >> limit >> k; // views::filter는 게으른 보기(view)라서 정렬할 수 없다: vector로 받아 둔다 auto view = items | std::views::filter([&](const Item& it) { return (kind == "*" || it.kind == kind) && it.price <= limit; }); std::vector<Item> picked(view.begin(), view.end()); std::ranges::sort(picked, byPriceThenName); std::cout << picked.size(); for (const Item& it : picked | std::views::take(k)) std::cout << ' ' << it.name; std::cout << '\n'; }}