Leta Learns

[Python] 백준 2621번 - 카드게임 본문

Coding/백준

[Python] 백준 2621번 - 카드게임

leta 2022. 1. 16. 16:09

문제 https://www.acmicpc.net/problem/2621

 

2621번: 카드게임

근우는 오늘 재미있는 카드 게임을 배우고 있다. 카드는 빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있고, 색깔별로 1부터 9까지 숫자가 쓰여진 카드가 9장씩 있다. 카드는 모두 36(=4x9)장이다.

www.acmicpc.net

역시나 어려운 구현 문제..

 

card 변수에 색과 숫자를 리스트로 입력 받은 후 colors, numbers에 각각 색과 숫자 정보를 따로 넣어주었다.

색과 숫자의 개수를 구하기 위해 cnt_color 딕셔너리와 cnt_num 리스트를 만들었다.

for문을 돌려서 입력 받은 카드의 색과 숫자를 확인하며 cnt를 1씩 증가시켜주면 초기 작업이 끝난다.

 

 

9개의 조건을 만들어줄 차례이다.

 

먼저 고려할 점은 두 가지 이상의 규칙을 적용할 수 있는 경우 가장 높은 점수를 출력하여야 한다는 점이다.

if-elif 문을 사용하기 위해 가장 높은 점수를 받을 수 있는 조건부터 차례대로 조건문을 작성하였다.

본 문제의 경우 문제에서 제공한 조건 순서 그대로 하나하나 구현하면 된다.

 

우선 연속 숫자를 찾아야 하는 조건들(조건 1,5)을 구현하기 위해 sort_nums 라는 변수에 numbers 리스트를 복사하고 정렬해주었다. 리스트 복사는 .copy()

 

1번 조건은 카드 5장이 모두 같은 색상인 경우이므로, cnt_color의 값들 중 5가 존재하는 경우를 말한다. (5를 제외한 나머지 cnt_color의 값들은 전부 0)

그 후에 and를 사용하여 연속하는 숫자들 조건을 넣어주었다.

연속 숫자 찾는 조건은 더 쉽고 간단한 조건이 있을 것 같긴 한데.. 내 머리로는 아직 생각이 나지 않아서 그냥 노가다로 구현하였다. ㅎㅎ

 

5번 조건은 1번 조건에서 카드 5장이 모두 같은 색상이어야 하는 조건을 빼주면 된다.

 

7, 8번 조건은 하나의 elif 문에서 작성하였다.

  7번: 카드 5장 중 2장의 숫자가 같은 경우가 2개.

  8번: 카드 5장 중 2장의 숫자가 같은 경우가 1개. 

우선 2장의 숫자가 같은 한 가지 경우를 first 변수에 할당한다.

num1에 numbers 리스트를 복사한 후 for문을 돌려 numbers에서 first 변수에 해당하는 숫자를 삭제한다.

numbers에서 first를 삭제하였으므로 first의 개수도 0으로 변경해주어야 한다. (cnt_num[first] = 0)

이제 2장의 숫자가 같은 한 가지 경우(first)를 제외하고 생각할 수 있다.

남은 것들 중에서 또 2장의 숫자가 같은 경우(second)가 있다면 7번 조건, 없다면 8번 조건에 해당한다.

 

2, 3, 4, 6, 9 조건은 어렵지 않게 구현할 수 있으니 넘어간다.

 

마지막으로 구한 score를 출력해주면 끝.

 

 

import sys
input = sys.stdin.readline

card = [list(input().split()) for _ in range(5)]
colors = [i[0] for i in card]
numbers = [int(i[1]) for i in card]
cnt_color = {'R':0, 'B':0, 'Y':0, 'G':0}
cnt_num = [0 for _ in range(11)]
for i in range(5):
    color, number = card[i][0], int(card[i][1])
    cnt_color[color] += 1
    cnt_num[number] += 1
    
#1
sort_nums = numbers.copy()
sort_nums.sort()
if 5 in cnt_color.values() and sort_nums[0]+1 == sort_nums[1] and sort_nums[1]+1 == sort_nums[2] and sort_nums[2]+1 == sort_nums[3] and sort_nums[3]+1 == sort_nums[4]:
    score = max(numbers) + 900
#2
elif 4 in cnt_num:
    score = cnt_num.index(4) + 800
#3
elif 3 in cnt_num and 2 in cnt_num:
    score = cnt_num.index(3)*10 + cnt_num.index(2) + 700
#4
elif 5 in cnt_color.values():
    score = max(numbers) + 600
#5
elif sort_nums[0]+1 == sort_nums[1] and sort_nums[1]+1 == sort_nums[2] and sort_nums[2]+1 == sort_nums[3] and sort_nums[3]+1 == sort_nums[4]:
    score = max(numbers) + 500
#6
elif 3 in cnt_num:
    score = cnt_num.index(3) + 400
#7, 8
elif 2 in cnt_num:
    first = cnt_num.index(2)
    num1 = numbers.copy()
    for i in num1:
        if i == first:
            numbers.remove(i)
    cnt_num[first] = 0
    if 2 in cnt_num: #7
        second = cnt_num.index(2)
        score = max(first, second)*10 + min(first, second) + 300
    else: #8
        score = first + 200
#9
else:
    score = max(numbers) + 100

print(score)

 

 

 

Comments