https://www.acmicpc.net/problem/2890
예제 입력 1
10 10
S.....111F
S....222.F
S...333..F
S..444...F
S.555....F
S666.....F
S.777....F
S..888...F
S...999..F
S........F
예제 출력 1
1
2
3
4
5
6
5
4
3
실버 5 난이도의 구현 문제이고, Croatian Open Competition in Informatics에 출제된 문제입니다.
코드는 크게 두 부분의 반복문으로 이루어져 있습니다.
1은 크게 어렵지 않고,
2는 정통 sort를 사용할지 복잡도가 좀 나와도 전부 순회하며 구할지 고민하다가, 배의 개수가 항상 9개이니 순회해도 괜찮겠다고 판단하여 전부 순회하는 방식으로 순위를 구했습니다.
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int r, c;
cin >> r >> c;
int poses[9];
for (int i = 0; i < r; i++) {
int pos = -1;
int team = -1;
string row;
cin >> row;
for (int j = 0; j < c; j++) {
if (row[j] != 'S' && row[j] != '.' && row[j] != 'F') {
team = row[j] - '1';
pos = j;
break;
}
}
if (pos != -1 && team != -1) {
poses[team] = pos;
}
}
for (int i = 0; i < 9; i++) {
int rank = 1;
set<int> uniquePos;
for (int j = 0; j < 9; j++) {
if (poses[j] > poses[i] && !uniquePos.count(poses[j])) {
rank++;
uniquePos.insert(poses[j]);
}
}
cout << rank << endl;
}
return 0;
}