작성일 :

문제 링크

26676번 - Wybór zadań

설명

라운드별로 필요한 문제 수가 정해져 있을 때, 주어진 아이디어들로 모든 위치를 채울 수 있는지 판별하는 문제입니다. 라운드 1~4는 각 디비전당 1문제, 라운드 5는 각 디비전당 2문제가 필요합니다.


접근법

각 아이디어의 라운드와 디비전을 파싱해서 5×3 배열에 개수를 셉니다. 라운드 5는 2문제, 나머지 라운드는 1문제가 필요하므로 모든 위치에서 필요한 수량 이상인지 확인합니다.

하나라도 부족하면 NIE, 모두 충족하면 TAK을 출력합니다.


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
using System;

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);
    var cnt = new int[5, 3];

    var parts = Console.ReadLine()!.Split();
    for (var i = 0; i < n; i++) {
      var s = parts[i];
      var r = s[0] - '1';
      var d = s[1] - 'A';
      cnt[r, d]++;
    }

    var ok = true;
    for (var r = 0; r < 5; r++) {
      for (var d = 0; d < 3; d++) {
        var need = (r == 4) ? 2 : 1;
        if (cnt[r, d] < need) { ok = false; break; }
      }
      if (!ok) break;
    }

    Console.WriteLine(ok ? "TAK" : "NIE");
  }
}

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
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;
  int cnt[5][3] = {};

  for (int i = 0; i < n; i++) {
    string s; cin >> s;
    int r = s[0] - '1';
    int d = s[1] - 'A';
    cnt[r][d]++;
  }

  bool ok = true;
  for (int r = 0; r < 5 && ok; r++) {
    for (int d = 0; d < 3; d++) {
      int need = (r == 4) ? 2 : 1;
      if (cnt[r][d] < need) { ok = false; break; }
    }
  }

  cout << (ok ? "TAK" : "NIE") << "\n";

  return 0;
}