문제
상근이는 카약 대회를 개최했다. 대회는 전세계에 생중계되고, 위성이 경기장 전체를 촬영하고 있다. 상근이는 위성 사진을 바탕으로 실시간 순위를 계산하는 프로그램을 만들려고 한다.
위성 사진은 R행 C열이다. 모든 줄의 첫 번째 글자는 'S'이고 출발선을 의미한다. 또, 마지막 글자는 'F'이고 이것은 결승선을 의미한다. 대회에 참가한 팀은 총 9팀이고, 각 팀은 1부터 9까지 번호가 매겨져 있다. 카약은 항상 열에 대해 연속하는 세 칸을 차지하며, 카약 번호로 표시한다. 마지막으로 물은 '.'로 나타나 있다.
팀의 순위는 결승선으로부터 떨어진 거리로 측정한다. 가까울수록 순위가 높다. 만약, 두 팀이 결승선과 떨어진 거리가 같다면, 같은 등수이다.
입력
첫째 줄에 R과 C가 주어진다. 다음 R개 줄에는 '.', 'S', 'F', '1'~'9'로 이루어진 위성 지도가 주어진다. 한 줄에는 최대 한 개의 카약만 있고, 위성 사진에 있는 카약은 항상 9개이다. (10 ≤ R, C ≤ 50)
출력
출력은 총 9줄을 해야 한다. i번째 줄에는 i번 팀의 등수를 출력한다. (i=1~9)
풀이 과정
한 줄마다 카약이 있는지 탐색해보고, 있다면 카약이 결승선부터 얼마나 떨어져있는지를 저장한다.
결승선부터 얼마나 떨어져있는지 순서대로 카약 번호와 함께 정렬하여, 등수를 매긴다.
그 이후, 카약 번호 순서대로 등수와 함께 정렬하여 출력한다.
C
#include <stdio.h>
typedef struct _TEAM {
int number;
int distance;
int rank;
} Team;
Team t[9];
char map[55][55];
int main(void) {
for (int i = 0; i < 9; i++) {
t[i].number = i + 1;
t[i].distance = 0;
t[i].rank = 0;
}
int r, c;
scanf("%d %d", &r, &c);
for (int i = 0; i < r; i++) scanf("%s", map[i]);
for (int i = 0; i < r; i++) {
for (int j = c - 1; j >= 0; j--) {
if ('1' <= map[i][j] && map[i][j] <= '9')
t[map[i][j] - '1'].distance = c - j;
}
}
// Selection Sort - Distance
for (int i = 0; i < 8; i++) {
int min = i;
for (int j = i + 1; j < 9; j++) {
if (t[min].distance > t[j].distance) min = j;
}
if (min != i) {
Team tmp = t[min];
t[min] = t[i];
t[i] = tmp;
}
}
int rankCnt = 1;
t[0].rank = 1;
for (int i = 1; i < 9; i++) {
if (t[i-1].distance != t[i].distance) rankCnt += 1;
t[i].rank = rankCnt;
}
// Selection Sort - Number
for (int i = 0; i < 8; i++) {
int min = i;
for (int j = i + 1; j < 9; j++) {
if (t[min].number > t[j].number) min = j;
}
if (min != i) {
Team tmp = t[min];
t[min] = t[i];
t[i] = tmp;
}
}
for (int i = 0; i < 9; i++)
printf("%d\n", t[i].rank);
return 0;
}
Python
import sys
input = sys.stdin.readline
r, c = map(int, input().rstrip().split())
maps = [list(input().rstrip()) for _ in range(r)]
arr = []
for i in range(r):
for k in range(1, 10):
if maps[i].count(str(k)) > 0:
cnt = 0
for j in range(c-1, -1, -1):
if maps[i][j] == str(k):
break
cnt += 1
arr.append([cnt, k, 0])
arr.sort(key=lambda x:x[0])
arr[0][2] = 1
now = 1
for i in range(1, len(arr)):
if arr[i][0] != arr[i-1][0]:
now += 1
arr[i][2] = now
arr.sort(key=lambda x:x[1])
for i in range(len(arr)):
print(arr[i][2])
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1373 : 2진수 8진수 ( BRONZE 1 ) / C, Python (0) | 2023.11.21 |
---|---|
[ BOJ ] 1212 : 8진수 2진수 ( BRONZE 2 ) / C, Python (0) | 2023.11.21 |
[ BOJ ] 1296 : 팀 이름 정하기 ( BRONZE 1 ) / C, Python (0) | 2023.11.20 |
[ BOJ ] 25166 : 배고픈 아리의 샌드위치 구매하기 ( BRONZE 1 ) / C, Python (0) | 2023.11.19 |
[ BOJ ] 1076 : 저항 ( BRONZE 2 ) / C, Python (0) | 2023.11.19 |