[BOJ 25185] - 카드 뽑기 (구현, C++, Python)

보양쿠·2024년 3월 6일
0

BOJ

목록 보기
210/252

BOJ 25185 - 카드 뽑기 링크
(2024.03.06 기준 S4)

문제

(1m, 2m, ..., 9m, 1p, 2p, ..., 9p, 1s, 2s, ..., 9s)으로 구성이 되어 있는 27장 카드 중 4장을 뽑았을 때

  • 적힌 알파벳이 같으면서 숫자가 연속되는 세 장이 존재한다. 연속한 세 숫자는 서로 다른 숫자여야 한다.
  • 적힌 알파벳과 숫자가 모두 같은 세 장이 존재한다.
  • 두 장씩 짝지었을 때, 짝을 지은 카드끼리 적힌 숫자와 알파벳이 같다.

위 세 경우 중 하나에 포함되는지 판별

알고리즘

간단한 구현

풀이

첫 번째와 두 번째 경우는 세 카드, 세 번째 경우는 네 카드가 필요한데 이를 그냥 지문 그대로 구현해주면 된다.

각 언어에 내장되어 있는 순열(permutation)을 뽑아주는 함수, 연속한 세 숫자인지 판단할 때 정렬 함수. 이 두 함수를 사용한다면 훨씬 편하겠지만, 사용하지 않고 naive하게 구현을 꼭 시도해보자.

코드

  • C++
#include <bits/stdc++.h>
using namespace std;

bool check(string &a, string &b, string &c){
    if (a[1] == b[1] && b[1] == c[1]){
        char d = a[0], e = b[0], f = c[0];
        if ((d + 2 == e + 1 && e + 1 == f) || (d + 2 == f + 1 && f + 1 == e) || (e + 2 == d + 1 && d + 1 == f) || (e + 2 == f + 1 && f + 1 == d) || (f + 2 == d + 1 && d + 1 == e) || (f + 2 == e + 1 && e + 1 == d)) return true;
    }
    return false;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int T; cin >> T;
    string a, b, c, d;
    for (; T; T--){
        cin >> a >> b >> c >> d;

        // 적힌 알파벳과 숫자가 모두 같은 세 장이 존재한다.
        if ((a == b && b == c) || (a == b && b == d) || (a == c && c == d) || (b == c && c == d)) cout << ":)\n";
    
        // 두 장씩 짝지었을 때, 짝을 지은 카드끼리 적힌 숫자와 알파벳이 같다.
        else if ((a == b && c == d) || (a == c && b == d) || (a == d && b == c)) cout << ":)\n";

        // 적힌 알파벳이 같으면서 숫자가 연속되는 세 장이 존재한다. 연속한 세 숫자는 서로 다른 숫자여야 한다.
        else if (check(a, b, c) || check(a, b, d) || check(a, c, d) || check(b, c, d)) cout << ":)\n";

        else cout << ":(\n";
    }
}
  • Python
import sys; input = sys.stdin.readline

def check(a, b, c):
    if a[1] == b[1] == c[1]:
        d = int(a[0]); e = int(b[0]); f = int(c[0])
        if d + 2 == e + 1 == f or d + 2 == f + 1 == e or e + 2 == d + 1 == f or e + 2 == f + 1 == d or f + 2 == d + 1 == e or f + 2 == e + 1 == d:
            return True
    return False

for _ in range(int(input())):
    a, b, c, d = input().split()

    # 적힌 알파벳과 숫자가 모두 같은 세 장이 존재한다.
    if a == b == c or a == b == d or a == c == d or b == c == d:
        print(':)')

    # 두 장씩 짝지었을 때, 짝을 지은 카드끼리 적힌 숫자와 알파벳이 같다.
    elif (a == b and c == d) or (a == c and b == d) or (a == d and b == c):
        # 틀린 이유 (a == d or b == d)
        print(':)')

    # 적힌 알파벳이 같으면서 숫자가 연속되는 세 장이 존재한다. 연속한 세 숫자는 서로 다른 숫자여야 한다.
    elif check(a, b, c) or check(a, b, d) or check(a, c, d) or check(b, c, d):
        print(':)')

    else:
        print(':(')
profile
GNU 16 statistics & computer science

0개의 댓글