※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25185번 문제인 카드 뽑기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25185
25185번: 카드 뽑기
상필이는 매일 꾸준히 백준에서 문제를 풀며 알고리즘을 공부한다. 꾸준히 문제를 풀어오다 보니 지친 상필이는 휴식이 필요하다는 생각이 들었다. 그래서 카드 뽑기를 통해 쉬는 날을 정하기
www.acmicpc.net
주어지는 1m~9m 카드를 각각 1부터 9까지의 정수, 1p~9p 카드를 각각 11부터 19까지의 정수, 1s~9s 카드를 각각 21에서 29까지의 정수로 치환해보자. 이 때, 문제의 조건들은 다음과 같이 간단한 조건들을 확인하는 것으로 충분히 체크할 수 있다.
1) 적힌 알파벳이 같으면서 숫자가 연속한 세 장의 카드가 있다 -> 셋 이상의 수가 연속한다.
2) 적힌 알파벳과 숫자가 같은 세 장의 카드가 있다 -> 같은 수가 셋 이상 있다.
3) 두 장씩 짝지었을 때, 짝을 지은 카드끼리 적힌 숫자와 알파벳이 같다 -> 두 개의 서로 다른 수가 각각 두 개씩 있다.
크기가 30인 배열을 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int cnt[30];
void solve() {
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < 4; i++) {
string s; cin >> s;
int cur = s[0] - '0';
char& l = s[1];
if (l == 'p') cur += 10;
else if (l == 's') cur += 20;
cnt[cur]++;
}
bool chk = 0;
for (int i = 0; i < 28; i++) {
if (cnt[i] && cnt[i + 1] && cnt[i + 2]) chk = 1;
}
int cnt2 = 0;
for (int i = 0; i < 30; i++) {
if (cnt[i] > 2) chk = 1;
else if (cnt[i] == 2) cnt2++;
}
if (cnt2 == 2) chk = 1;
if (chk) cout << ":)\n";
else cout << ":(\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) solve();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5623 // C++] 수열의 합 (0) | 2022.08.15 |
---|---|
[BOJ 25186 // C++] INFP 두람 (0) | 2022.08.14 |
[BOJ 4850 // C++] Baskets of Gold Coins (0) | 2022.08.14 |
[BOJ 25184 // C++] 동가수열 구하기 (0) | 2022.08.14 |
[BOJ 6132 // C++] 전화선 (0) | 2022.08.14 |