첫 줄에 학생 수 n이 주어지고, 다음 n줄에 "이름 국어 영어 수학"이 빈칸 하나씩으로 나뉘어 주어진다. 학생마다 세 과목의 합계를 구해 순위표를 출력하라. 합계가 큰 학생부터 쓰고, 합계가 같으면 이름의 글자 코드 순(ASCII: 대문자가 소문자보다 먼저, 앞부분이 같으면 짧은 것이 먼저)으로 쓴다. 줄마다 "등수 이름 합계"를 출력한다. 등수는 1 + (나보다 합계가 큰 학생 수)다. 그래서 합계가 같은 학생은 등수가 같고, 다음 등수는 그만큼 건너뛴다(예: 1, 1, 3).
입력
1 ≤ n ≤ 1000, 0 ≤ 점수 ≤ 100(정수). 이름은 영어 대소문자 1 ~ 10글자이고 서로 다르다
출력
n줄, 줄마다 등수·이름·합계를 빈칸 하나씩으로
예시 1 · stdin
5
mina 90 85 100
Jun 80 95 100
alex 70 60 50
seo 100 100 75
Bora 60 60 60
stdout
1 Jun 275
1 mina 275
1 seo 275
4 Bora 180
4 alex 180
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
학생 한 명(이름, 합계)을 한 덩어리로 묶는 법이 언어마다 달라요: Python @dataclass(또는 튜플), Java record Student(String name, int total), C# record Student(string Name, int Total), C·C++ struct, JS·TS 객체 { name, total }(TS는 interface로 모양을 적어요). 크레이콘에는 클래스가 없어서 학생마다 사전() 하나(s["name"], s["total"])를 만들어 목록에 넣고, students.정렬(합계순)처럼 비교 함수 이름을 넘겨요. 함정 셋: ① 이름 목록과 합계 목록을 따로 두고(평행 목록) 합계만 정렬하면 짝이 어긋나요 — 묶어서 정렬해야 해요. ② Python에서 (합계, 이름)을 reverse=True로 정렬하면 이름까지 거꾸로 돼요(key=lambda s: (-s.total, s.name)). ③ 이름 비교: JS localeCompare는 사람 사전 순이라 "amy"가 "Bob"보다 앞이고, C#의 기본 문자열 비교도 문화권 규칙을 따를 수 있어요. 글자 코드 순은 JS <, C# StringComparer.Ordinal, Java compareTo, C strcmp, C++ <. 등수는 자리 번호 i + 1이 아니라 앞 사람과 합계가 다를 때만 i + 1로 바꿔요.
Pythonmain.py · 23 줄
import sysfrom dataclasses import dataclass@dataclassclass Student: name: str total: intlines = sys.stdin.read().split("\n")n = int(lines[0])students = []for line in lines[1:n + 1]: name, *scores = line.split() students.append(Student(name, sum(map(int, scores))))students.sort(key=lambda s: (-s.total, s.name))rank = 0for i, s in enumerate(students): if i == 0 or s.total != students[i - 1].total: rank = i + 1 print(rank, s.name, s.total)
JavaScriptmain.js · 16 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const students = [];for (let i = 1; i <= n; i++) { const [name, ...scores] = lines[i].trim().split(" "); students.push({ name, total: scores.reduce((sum, x) => sum + Number(x), 0) });}// 이름은 글자 코드 순(< 비교). localeCompare는 대소문자를 사람 사전처럼 섞는다students.sort((a, b) => b.total - a.total || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));const out = [];let rank = 0;students.forEach((s, i) => { if (i === 0 || s.total !== students[i - 1].total) rank = i + 1; out.push(`${rank} ${s.name} ${s.total}`);});console.log(out.join("\n"));
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Comparator;import java.util.List;public class Main { record Student(String name, int total) {} public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); List<Student> students = new ArrayList<>(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); int total = Integer.parseInt(p[1]) + Integer.parseInt(p[2]) + Integer.parseInt(p[3]); students.add(new Student(p[0], total)); } // String.compareTo는 글자 코드 순이다(대문자가 소문자보다 먼저) students.sort(Comparator.comparingInt(Student::total).reversed().thenComparing(Student::name)); StringBuilder out = new StringBuilder(); int rank = 0; for (int i = 0; i < n; i++) { Student s = students.get(i); if (i == 0 || s.total() != students.get(i - 1).total()) rank = i + 1; out.append(rank).append(' ').append(s.name()).append(' ').append(s.total()).append('\n'); } System.out.print(out); }}
C#Main.cs · 27 줄
using System;using System.Collections.Generic;using System.Linq;record Student(string Name, int Total);class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); var students = new List<Student>(); for (int i = 0; i < n; i++) { string[] p = Console.ReadLine().Trim().Split(' '); students.Add(new Student(p[0], p.Skip(1).Sum(int.Parse))); } // 기본 문자열 비교는 문화권 규칙을 따를 수 있어 글자 코드 순(Ordinal)을 밝혀 준다 var sorted = students.OrderByDescending(s => s.Total).ThenBy(s => s.Name, StringComparer.Ordinal).ToList(); int rank = 0; for (int i = 0; i < sorted.Count; i++) { if (i == 0 || sorted[i].Total != sorted[i - 1].Total) rank = i + 1; Console.WriteLine($"{rank} {sorted[i].Name} {sorted[i].Total}"); } }}
C++main.cpp · 30 줄
#include <algorithm>#include <iostream>#include <string>#include <vector>struct Student { std::string name; int total;};int main() { int n; std::cin >> n; std::vector<Student> students; for (int i = 0; i < n; i++) { std::string name; int k, e, m; std::cin >> name >> k >> e >> m; students.push_back({name, k + e + m}); } std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { if (a.total != b.total) return a.total > b.total; return a.name < b.name; }); int rank = 0; for (int i = 0; i < n; i++) { if (i == 0 || students[i].total != students[i - 1].total) rank = i + 1; std::cout << rank << ' ' << students[i].name << ' ' << students[i].total << '\n'; }}
Cmain.c · 32 줄
#include <stdio.h>#include <stdlib.h>#include <string.h>struct Student { char name[11]; int total;};static int by_total_then_name(const void *pa, const void *pb) { const struct Student *a = pa, *b = pb; if (a->total != b->total) return b->total - a->total; return strcmp(a->name, b->name); /* 글자 코드 순 */}int main(void) { static struct Student s[1000]; int n; scanf("%d", &n); for (int i = 0; i < n; i++) { int k, e, m; scanf("%10s %d %d %d", s[i].name, &k, &e, &m); s[i].total = k + e + m; } qsort(s, n, sizeof s[0], by_total_then_name); int rank = 0; for (int i = 0; i < n; i++) { if (i == 0 || s[i].total != s[i - 1].total) rank = i + 1; printf("%d %s %d\n", rank, s[i].name, s[i].total); } return 0;}
Craykonmain.cray · 36 줄
// 크레이콘에는 클래스가 없어서 학생 한 명을 사전 하나(이름·합계)로 묶는다n = 콘솔.줄읽기().수로변환();students = [];반복 (i = 0; i < n; i++){ p = 콘솔.줄읽기().공백제거().나누기(); s = 사전(); s["name"] = p[0]; s["total"] = p[1].수로변환() + p[2].수로변환() + p[3].수로변환(); students.넣기(s);}students.정렬(합계순);rank = 0;반복 (i = 0; i < n; i++){ s = students[i]; 만약 (i == 0 || s["total"] != students[i - 1]["total"]) { rank = i + 1; } 콘솔.쓰기(rank + " " + s["name"] + " " + s["total"]);}// 합계가 큰 것 먼저, 같으면 이름의 글자 코드 순합계순(앞, 뒤){ 만약 (앞["total"] != 뒤["total"]) { 돌려주기 뒤["total"] - 앞["total"]; } 만약 (앞["name"] < 뒤["name"]) { 돌려주기 -1; } 돌려주기 1;}