작성일 :

문제 링크

20268번 - Keystroke

설명

2x2 키패드에서 여러 키를 동시에 누르면 행 집합과 열 집합만 전달됩니다. 키 1은 (0,0), 키 2는 (0,1), 키 3은 (1,0), 키 4는 (1,1) 위치입니다.

주어진 행 집합과 열 집합을 만들 수 있는 키 조합의 개수를 구하는 문제입니다.


접근법

먼저, 키가 4개뿐이므로 모든 부분집합(1부터 15까지)을 순회해도 충분합니다.

다음으로, 각 부분집합에 대해 포함된 키들의 행과 열을 모아 집합을 만듭니다.

이후, 만들어진 행 집합과 열 집합이 입력과 정확히 일치하면 카운트를 증가시킵니다.


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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;

namespace Solution {
  class Program {
    static (int r, int c)[] key = {
      (0, 0),
      (0, 0),
      (0, 1),
      (1, 0),
      (1, 1)
    };

    static void Main(string[] args) {
      var T = int.Parse(Console.ReadLine()!);
      while (T-- > 0) {
        var parts = Console.ReadLine()!.Split();
        var m = int.Parse(parts[0]);
        var n = int.Parse(parts[1]);

        var rows = new bool[2];
        var cols = new bool[2];

        var rowLine = Console.ReadLine()!.Split();
        for (var i = 0; i < m; i++) rows[int.Parse(rowLine[i])] = true;

        var colLine = Console.ReadLine()!.Split();
        for (var i = 0; i < n; i++) cols[int.Parse(colLine[i])] = true;

        var cnt = 0;
        for (var mask = 1; mask < 16; mask++) {
          var r = new bool[2];
          var c = new bool[2];
          for (var k = 1; k <= 4; k++) {
            if ((mask & (1 << (k - 1))) != 0) {
              r[key[k].r] = true;
              c[key[k].c] = true;
            }
          }
          if (r[0] == rows[0] && r[1] == rows[1] &&
              c[0] == cols[0] && c[1] == cols[1]) cnt++;
        }
        Console.WriteLine(cnt);
      }
    }
  }
}

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
30
31
32
33
34
35
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

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

  pii key[5] = {{0, 0}, {0, 0}, {0, 1}, {1, 0}, {1, 1}};

  int T; cin >> T;
  while (T--) {
    int m, n; cin >> m >> n;
    bool rows[2] = {false, false}, cols[2] = {false, false};
    for (int i = 0, v; i < m; i++) { cin >> v; rows[v] = true; }
    for (int i = 0, v; i < n; i++) { cin >> v; cols[v] = true; }

    int ans = 0;
    for (int mask = 1; mask < 16; mask++) {
      bool r[2] = {false, false}, c[2] = {false, false};
      for (int k = 1; k <= 4; k++) {
        if (mask & (1 << (k - 1))) {
          r[key[k].first] = true;
          c[key[k].second] = true;
        }
      }
      if (r[0] == rows[0] && r[1] == rows[1] &&
          c[0] == cols[0] && c[1] == cols[1]) ans++;
    }
    cout << ans << "\n";
  }

  return 0;
}