알고리즘/알고리즘_백준

[Python][백준] 2621. 카드 게임 / 빡구현 (S3)

Jerry_K 2024. 7. 16. 20:18

링크🔗

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


🗒️파이썬 코드 풀이

lst = []
for _ in range(5):
    C,N = input().split(" ")
    N = int(N)
    lst.append((C,N))

lst = sorted(lst,key=lambda x:x[1])

rs = 0

# 연속성 확인
def chk_sequence():
    sequence = True
    for i in range(len(lst)) :
        if lst[0][1] + i != lst[i][1]:
            sequence = False
            return sequence
    return sequence

# 색상 같음 확인 
def chk_same_color():
    same_color = True
    for i in range(len(lst)) :
        if lst[0][0] != lst[i][0]:
            same_color = False
            return same_color
    return same_color

# 같은 숫자 확인
def chk_same_number():
    num_lst = []
    num_cnt = [0] * 10

    for i in range(len(lst)) :
        num_lst.append(lst[i][1])
    num_set = set(num_lst)

    for s in num_set:
        num_cnt[s] = num_lst.count(s)
    return num_cnt

sequence = chk_sequence()
same_color = chk_same_color()
num_cnt = chk_same_number()

# 가장 큰 수를 구하는 코드
mx = max(list(filter(lambda x: num_cnt[x] == max(num_cnt), range(len(num_cnt)))))

if sequence and same_color:
    rs = 900 + mx
elif 4 in num_cnt :
    rs = 800 + mx
elif 3 in num_cnt and 2 in num_cnt:    
    rs = num_cnt.index(3)*10 + num_cnt.index(2) + 700
elif same_color:
    rs = 600 + mx 
elif sequence :
    rs = 500 + mx 
elif 3 in num_cnt:
    rs = 400 + mx 
elif 2 in num_cnt:
    if num_cnt.count(2) == 2:
        rs = 300 + mx*10 + num_cnt.index(2)
    else:
        rs = 200 + mx
else:
    rs = 100 + mx

print(rs)

 

1. 점수를 정하는 규칙들이 많다.  그 규칙에서 공통적인 것들을 찾아보자. 

1. 연속성 
2. 모두 같은색
3. 같은 숫자 개수 + 같은 숫자들의 번호

 

2. 연속성 확인 함수 구현

입력 받은 lst를 정렬하고, 반복문으로 연속성을 확인 하였다.

 

3. 같은 색상 확인 함수 구현

이것도 간단하게 반복문을 통해서 주어진 카드의 색이 모두 같은지 확인 하였다.

 

4. 같은 숫자 확인 함수 구현

1~9까지의 숫자카드에서 같은 숫자의 개수를 기록해줄  num_lst 리스트를 만들어준다

(인덱싱 편하게 하기위해 0~9를 다 포함하도록 리스트 만듬)

 

그리고 주어진 카드 숫자들에서 중복되는 것을 없애기 위해, num_set 집합을 만들고,

num_set 집합을 반복문에 돌려, 각각 숫자들이 몇개인지 체크를 한다.

 

5. 같은 숫자들이 여러개 있을때 가장 큰 수를 추출해야하는데, 

filter를 이용하여 그 값을 찾아준다. 

ex ) 카드 숫자 1이 1개 / 2가 2개 / 7이 2개 인 경우
num_lst = [0, 1 , 2 , 0 , 0 , 0 , 0 , 2 , 0 , 0 ] 로 만들어진다.
filter 없이 num_cnt.index(max(num_cnt))  이런식으로 하면 숫자 2 밖에 안나오는데,
filter 통해 같은 같은 숫자들 번호 중 가장 큰 값(7)을 뽑느다. 
(사실 그냥 if / for문 써도 된다...)

 

6. 이제 순차적으로 900부터 조건에 맞게 식을 작성하면 된다.

단위가 100차이가 나기때문에,  자신보다 높은 규칙을 초과하지 못한다.

 

 

📌  문제 코멘트

 

문제의 조건이 정말 많은 빡구현 문제이다 ... 

이거는 진짜 답이 없는게, 다른 사람들 문제 풀이를 봐도 

결국에는 내가 어떻게서든 해결해야한다. 

 

구현이 막 어렵지는 않으니, 하나 하나 쪼개고

중간 중간에 코드들이 잘 돌아가는지 확인하면서 작성하자 ! 


📚문제

근우는 오늘 재미있는 카드 게임을 배우고 있다. 카드는 빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있고, 색깔별로 1부터 9까지 숫자가 쓰여진 카드가 9장씩 있다. 카드는 모두 36(=4x9)장이다. 근우가 배운 카드 게임은 36장의 카드에서 5장을 뽑고, 아래와 같은 규칙으로 정수를 계산하는 것이다.

각 카드는 다음과 같이 나타낸다. 카드의 색깔은 영어 대문자 R, B, Y, G로 나타내는데, R은 빨간색, B는 파란색, Y는 노란색, G는 녹색을 뜻한다. 예를 들어서 Y8은 노란색 8을 나타내고, B5는 파란색 5를 나타낸다.

<점수를 정하는 규칙>

  1. 카드 5장이 모두 같은 색이면서 숫자가 연속적일 때, 점수는 가장 높은 숫자에 900을 더한다. 예를 들어, 카드가 Y4, Y3, Y2, Y5, Y6 일 때 점수는 906(=6+900)점이다.
  2. 카드 5장 중 4장의 숫자가 같을 때 점수는 같은 숫자에 800을 더한다. 예를 들어, 카드가 B3, R3, B7, Y3, G3 일 때 점수는 803(=3+800)점이다.
  3. 카드 5장 중 3장의 숫자가 같고 나머지 2장도 숫자가 같을 때 점수는 3장이 같은 숫자에 10을 곱하고 2장이 같은 숫자를 더한 다음 700을 더한다. 예를 들어, 카드가 R5, Y5, G7, B5, Y7 일 때 점수는 757(=5x10+7+700)점이다.
  4. 5장의 카드 색깔이 모두 같을 때 점수는 가장 높은 숫자에 600을 더한다. 예를 들어, 카드가 Y3, Y4, Y8, Y6, Y7 일 때 점수는 608(=8+600)점이다.
  5. 카드 5장의 숫자가 연속적일 때 점수는 가장 높은 숫자에 500을 더한다. 예를 들어 R7, R8, G9, Y6, B5 일 때 점수는 509(=9+500)점이다.
  6. 카드 5장 중 3장의 숫자가 같을 때 점수는 같은 숫자에 400을 더한다. 예를 들어 R7, Y7, R2, G7, R5 일 때 점수는 407(=7+400)점이다.
  7. 카드 5장 중 2장의 숫자가 같고 또 다른 2장의 숫자가 같을 때 점수는 같은 숫자 중 큰 숫자에 10을 곱하고 같은 숫자 중 작은 숫자를 더한 다음 300을 더한다. 예를 들어, R5, Y5, Y4, G9, B4 일 때 점수는 354(=5X10+4+300)점이다.
  8. 카드 5장 중 2장의 숫자가 같을 때 점수는 같은 숫자에 200을 더한다. 예를 들어, R5, Y2, B5, B3, G4 일 때 점수는 205(=5+200)점이다.
  9. 위의 어떤 경우에도 해당하지 않을 때 점수는 가장 큰 숫자에 100을 더한다. 예를 들어, R1, R2, B4, B8, Y5 일 때 점수는 108(=8+100)점이다.

입력으로 카드 5장이 주어질 때, 카드 게임의 점수를 구하는 프로그램을 작성하시오. 두 가지 이상의 규칙을 적용할 수 있는 경우에는 가장 높은 점수가 카드 게임의 점수이다.

입력

첫째 줄부터 다섯째 줄까지 한 줄에 카드 하나씩 입력된다. 카드의 색깔과 숫자 사이에는 빈 칸이 하나 있다.

출력

한 줄에 카드의 점수를 출력한다.

예제 입력 1 복사

B 3
B 7
R 1
B 2
Y 7

예제 출력 1 복사

207