백준 2890 카약 (C++)

김서진·2024년 4월 28일
0

ps

목록 보기
2/2


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. string으로 각 줄을 입력받으면서, 각 배의 시작 위치를 구하고 배열에 저장
  2. 각 배의 시작 위치를 구한 배열을 순회하며 각 배의 순위 출력

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;
}
profile
뭐라도 더 하자~

0개의 댓글