[백준 5602] 問題1 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
각 장소를 원하는 사람 수를 세고, 인원이 많은 순서대로 장소 번호를 출력하는 문제입니다.
접근법
학생들의 응답을 모두 모아 장소별로 원하는 사람 수를 집계합니다.
집계 결과를 인원이 많은 순서로 정렬하고, 인원이 같으면 번호가 작은 곳부터 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Linq;
using System.Text;
class Program {
static void Main() {
var parts = Console.In.ReadToEnd().Split();
var idx = 0;
var n = int.Parse(parts[idx++]);
var m = int.Parse(parts[idx++]);
var cnt = new int[m];
for (var i = 0; i < n; i++) {
for (var j = 0; j < m; j++) {
cnt[j] += int.Parse(parts[idx++]);
}
}
var order = Enumerable.Range(0, m)
.OrderByDescending(i => cnt[i])
.ThenBy(i => i)
.ToArray();
var sb = new StringBuilder();
for (var i = 0; i < m; i++) {
if (i > 0) sb.Append(' ');
sb.Append(order[i] + 1);
}
Console.WriteLine(sb.ToString());
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> cnt(m, 0);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int x; cin >> x;
cnt[j] += x;
}
}
vector<int> idx(m);
for (int i = 0; i < m; i++) idx[i] = i;
sort(idx.begin(), idx.end(), [&](int a, int b) {
if (cnt[a] != cnt[b]) return cnt[a] > cnt[b];
return a < b;
});
for (int i = 0; i < m; i++) {
if (i > 0) cout << ' ';
cout << idx[i] + 1;
}
cout << "\n";
return 0;
}