※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts