Home > Algorithm > BOJ > [BOJ] 2890번 카약

[BOJ] 2890번 카약
C++ 백준 BOJ 알고리즘 Algorithm

🔗 문제

https://www.acmicpc.net/problem/2890


📌 문제 요약

상근이는 카약 대회를 개최했다. 대회는 전세계에 생중계되고, 위성이 경기장 전체를 촬영하고 있다. 상근이는 위성 사진을 바탕으로 실시간 순위를 계산하는 프로그램을 만들려고 한다.
위성 사진은 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)


💡 접근 방법

입력 받은 숫자를 인덱스로 마지막 위치를 배열에 담고,
해당 배열을 기준으로 결승점에서부터 랭킹을 다른 배열에 담아 출력했다.


⚠️ 처음에 했던 실수


💻 코드

#include <iostream>
using namespace std;

int R, C;
char map[51][51];
int pos[10];
int r[10];

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  cin >> R >> C;

  for (int i = 0; i < R; ++i) {
    for (int j = 0; j < C; ++j) {
      cin >> map[i][j];
      if (map[i][j] > '0' && map[i][j] <= '9')
        pos[map[i][j] - '0'] = j;
    }
  }

  int rank = 1;
  for (int i = C - 2; i > 0; --i) {
    bool isRanking = false;
    for (int j = 1; j <= 9; ++j) {
      if (pos[j] != i)
        continue;

      r[j] = rank;
      isRanking = true;
    }

    if (isRanking)
      rank++;
  }

  for (int i = 1; i <= 9; ++i) {
    cout << r[i] << '\n';
  }
  return 0;
}