[백준 20268] Keystroke (C#, C++) - soo:bak
작성일 :
문제 링크
설명
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;
}