팀을 클래스로 만들고, 승점을 계산하는 메서드 points()를 두어라(승점 = 3 × 승 + 무, 패는 0점). 첫 줄에 팀 수 n, 다음 n줄에 "이름 승 무 패"가 빈칸 하나로 나뉘어 주어진다. 팀 객체 목록을 다음 순서로 정렬해 팀마다 "이름 승점"을 한 줄씩 출력하라: 승점이 높은 팀이 먼저, 승점이 같으면 승이 많은 팀이 먼저, 승점과 승이 모두 같으면 입력에서 먼저 나온 팀이 먼저.
입력
1 ≤ n ≤ 2000, 0 ≤ 승·무·패 ≤ 100(정수). 이름은 영어 소문자·숫자 1 ~ 10글자이고 같은 이름이 또 나올 수 있다
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 6개 언어 풀이
이 문제는 클래스가 있는 Python·JavaScript·TypeScript·Java·C#·C++만 받아요(C에는 클래스가 없고, 크레이콘은 아직 클래스를 만들 수 없어요). 정렬 기준이 필드가 아니라 메서드 결과예요: Python key=lambda t: (t.points(), t.wins), Java Comparator.comparingInt(Team::points).thenComparingInt(Team::getWins), C# OrderByDescending(t => t.Points()).ThenByDescending(t => t.Wins). 마지막 규칙 "같으면 입력 차례"는 안정 정렬이면 저절로 지켜져요. Python sort, JS·TS Array.prototype.sort(ES2019부터), Java List.sort(객체), C# LINQ OrderBy는 안정이고, C# List.Sort와 C++ std::sort는 안정이 아니라서 C++는 std::stable_sort를 써야 해요. 함정이 셋 더 있어요. Python에서 오름차순 정렬 뒤 reverse()하면 동점끼리의 차례까지 뒤집혀요(reverse=True는 동점 차례를 지켜요). JS 비교 함수가 a.points() < b.points()처럼 true/false를 돌려주면 음수가 없어서 정렬이 틀어지니 b.points() - a.points()처럼 음수·0·양수를 돌려주세요. Java reversed()는 그때까지 이어 붙인 비교 전체를 뒤집어서, comparingInt(...).reversed().thenComparingInt(...).reversed()는 승점이 다시 오름차순이 돼요.
Pythonmain.py · 24 줄
import sysclass Team: def __init__(self, name, wins, draws, losses): self.name = name self.wins = wins self.draws = draws self.losses = losses def points(self): return 3 * self.wins + self.drawslines = sys.stdin.read().split("\n")n = int(lines[0])teams = []for line in lines[1:n + 1]: name, w, d, l = line.split() teams.append(Team(name, int(w), int(d), int(l)))# 정렬은 안정적이라 승점·승수가 같으면 입력 차례가 남는다teams.sort(key=lambda t: (t.points(), t.wins), reverse=True)print("\n".join(f"{t.name} {t.points()}" for t in teams))
JavaScriptmain.js · 24 줄
class Team { constructor(name, wins, draws, losses) { this.name = name; this.wins = wins; this.draws = draws; this.losses = losses; } points() { return 3 * this.wins + this.draws; }}const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const teams = [];for (let i = 1; i <= n; i++) { const [name, w, d, l] = lines[i].trim().split(" "); teams.push(new Team(name, Number(w), Number(d), Number(l)));}// 비교 함수는 음수·0·양수를 돌려줘야 한다. sort는 안정적이라 같으면 입력 차례가 남는다teams.sort((a, b) => b.points() - a.points() || b.wins - a.wins);console.log(teams.map((t) => `${t.name} ${t.points()}`).join("\n"));
TypeScriptmain.ts · 31 줄
import { readFileSync } from "node:fs";class Team { readonly name: string; readonly wins: number; readonly draws: number; readonly losses: number; constructor(name: string, wins: number, draws: number, losses: number) { this.name = name; this.wins = wins; this.draws = draws; this.losses = losses; } points(): number { return 3 * this.wins + this.draws; }}const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const teams: Team[] = [];for (let i = 1; i <= n; i++) { const [name, w, d, l] = lines[i].trim().split(" "); teams.push(new Team(name, Number(w), Number(d), Number(l)));}// 비교 함수는 음수·0·양수를 돌려줘야 한다. sort는 안정적이라 같으면 입력 차례가 남는다teams.sort((a, b) => b.points() - a.points() || b.wins - a.wins);console.log(teams.map((t) => `${t.name} ${t.points()}`).join("\n"));
JavaMain.java · 40 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Comparator;import java.util.List;class Team { private final String name; private final int wins, draws, losses; Team(String name, int wins, int draws, int losses) { this.name = name; this.wins = wins; this.draws = draws; this.losses = losses; } String getName() { return name; } int getWins() { return wins; } int points() { return 3 * wins + draws; }}public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); List<Team> teams = new ArrayList<>(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); teams.add(new Team(p[0], Integer.parseInt(p[1]), Integer.parseInt(p[2]), Integer.parseInt(p[3]))); } // List.sort(객체)는 안정 정렬이라 같으면 입력 차례가 남는다 teams.sort(Comparator.comparingInt(Team::points).thenComparingInt(Team::getWins).reversed()); StringBuilder out = new StringBuilder(); for (Team t : teams) out.append(t.getName()).append(' ').append(t.points()).append('\n'); System.out.print(out); }}
C#Main.cs · 42 줄
using System;using System.Collections.Generic;using System.Linq;using System.Text;class Team{ public string Name { get; } public int Wins { get; } public int Draws { get; } public int Losses { get; } public Team(string name, int wins, int draws, int losses) { Name = name; Wins = wins; Draws = draws; Losses = losses; } public int Points() => 3 * Wins + Draws;}class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); var teams = new List<Team>(); for (int i = 0; i < n; i++) { string[] p = Console.ReadLine().Trim().Split(' '); teams.Add(new Team(p[0], int.Parse(p[1]), int.Parse(p[2]), int.Parse(p[3]))); } // List.Sort는 안정 정렬이 아니다. OrderBy는 안정이라 같으면 입력 차례가 남는다 var ranked = teams.OrderByDescending(t => t.Points()).ThenByDescending(t => t.Wins); var sb = new StringBuilder(); foreach (var t in ranked) sb.Append($"{t.Name} {t.Points()}\n"); Console.Write(sb); }}
C++main.cpp · 39 줄
#include <algorithm>#include <iostream>#include <string>#include <utility>#include <vector>class Team {public: Team(std::string name, int wins, int draws, int losses) : name_(std::move(name)), wins_(wins), draws_(draws), losses_(losses) {} const std::string& name() const { return name_; } int wins() const { return wins_; } int points() const { return 3 * wins_ + draws_; }private: std::string name_; int wins_, draws_, losses_;};int main() { std::ios::sync_with_stdio(false); int n; std::cin >> n; std::vector<Team> teams; for (int i = 0; i < n; i++) { std::string name; int w, d, l; std::cin >> name >> w >> d >> l; teams.emplace_back(name, w, d, l); } // std::sort는 안정 정렬이 아니다. stable_sort라야 같으면 입력 차례가 남는다 std::stable_sort(teams.begin(), teams.end(), [](const Team& a, const Team& b) { if (a.points() != b.points()) return a.points() > b.points(); return a.wins() > b.wins(); }); for (const Team& t : teams) std::cout << t.name() << ' ' << t.points() << '\n';}