{ }codelper
메서드자료 목록P0080

승점 순위표

팀을 클래스로 만들고, 승점을 계산하는 메서드 points()를 두어라(승점 = 3 × 승 + 무, 패는 0점).
첫 줄에 팀 수 n, 다음 n줄에 "이름 승 무 패"가 빈칸 하나로 나뉘어 주어진다.
팀 객체 목록을 다음 순서로 정렬해 팀마다 "이름 승점"을 한 줄씩 출력하라: 승점이 높은 팀이 먼저, 승점이 같으면 승이 많은 팀이 먼저, 승점과 승이 모두 같으면 입력에서 먼저 나온 팀이 먼저.

입력
1 ≤ n ≤ 2000, 0 ≤ 승·무·패 ≤ 100(정수).
이름은 영어 소문자·숫자 1 ~ 10글자이고 같은 이름이 또 나올 수 있다
출력
n줄, 줄마다 이름과 승점을 빈칸 하나로
예시 1 · stdin
5
lions 3 1 2
tigers 2 4 0
bears 3 1 0
hawks 0 5 1
owls 1 2 3
stdout
lions 10
bears 10
tigers 10
owls 5
hawks 5
main.py
입력(stdin)

실행하면 이 줄들이 차례로 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 sys  class 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.draws  lines = 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';}