알고리즘 풀이/백준

[백준 2621] 카드게임

mhko411 2021. 4. 26. 22:22
728x90

문제

빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있는 카드가 있고 각 색깔별로 1부터 9까지 숫자가 쓰여져있다. 총 36장의 카드에서 5장의 카다를 뽑고 아래와 같은 규칙으로 계산한다.

1. 카드 5장이 모두 같은 색이고 숫자가 연속될 때 가장 높은 숫자에 900을 더한다.

2. 카드 5장 중 4장의 숫자가 같을 때 점수는 같은 숫자에 800을 더한다.

3. 3장의 숫자가 같고 2장의 숫자도 같을 때 3장이 같은 숫자에 10을 곱하고 2장이 같은 숫자를 더한 다음 700을 더한다.

4. 5장의 숫자가 연속적일 때 점수는 가장 높은 숫자에 600을 더한다.

5. 카드 5장의 숫자가 연속적일 때 가장 높은 숫자에 500을 더한다.

6. 3장의 숫자가 같을 때 점수는 숫자에 400을 더한다.

7. 2장의 숫자가 같고 또 다른 2장의 숫자가 같을 때 큰 숫자에 10을 곱하고 작은 숫자를 더한 다음 300을 더한다.

8. 2장의 숫자가 같을 때 점수는 같은 숫자에 200을 더한다.

9. 위의 어떤 경우에도 해당하지 않을 때 가장 큰 숫자에 100을 더한다.

두 가지 이상의 규칙에 적용시킬 수 있을 때 가장 높은 점수를 출력한다.

 

입력

다섯 줄에 걸쳐서 카드의 색깔과 숫자가 빈 칸을 사이에 두고 입력된다.

 

출력

카드의 점수를 출력한다.


접근

주어진 조건대로 빠짐없이 구현하는 것이 중요하다.

점수의 조건을 좀 더 쉽게 구현하기 위해 색깔의 개수와 숫자의 개수를 따로 저장하여 조건을 분리할 때 사용한다.

 

구현

- 5장의 카드를 입력받아 (색깔, 숫자)의 쌍으로 card_list에 저장한다.

- 이후 색깔의 개수를 color_count에 저장하고, 숫자의 개수를 number_count에 저장한다.

card_list = []
color_count = {
    'R':0,
    'B':0,
    'Y':0,
    'G':0,
}
number_count = [0] * 10

for _ in range(5):
    color, number = map(str, input().split())
    number = int(number)
    card_list.append((color, number))

    color_count[color] += 1
    number_count[number] += 1

 

- solve함수에서 조건을 모두 나눠서 처리한다.

def solve():
    # 1
    if 5 in color_count.values():
        count = 0
        max_num = 0

        for number, cnt in enumerate(number_count):

            if cnt > 0:
                count += 1
                max_num = max(max_num, number)
            else:
                count = 0
            if count == 5:
                break

        if count == 5:

            result = max_num + 900
            return result
    # 2
    elif 4 in number_count:
        number = number_count.index(4)
        result = 800 + number
        return result
    # 3
    elif 3 in number_count and 2 in number_count:
        number3 = number_count.index(3)
        number2 = number_count.index(2)
        result = number3 * 10 + number2 + 700
        return result

    # 4
    if 5 in color_count.values():
        max_num = 0
        for color, number in card_list:
            if max_num < number:
                max_num = number
        result = 600 + number
        return result

    # 5
    cnt = 0
    max_num = 0
    for number, count in enumerate(number_count):
        if count > 0:
            cnt += 1
            max_num = max(max_num, number)
        else:
            cnt = 0
        if cnt == 5:
            break
    if cnt == 5:
        result = 500 + max_num
        return result
    # 6
    if 3 in number_count:
        number = number_count.index(3)
        result = 400 + number
        return result

    # 7
    cnt = 0
    max_num = 0
    min_num = 9
    for number, count in enumerate(number_count):
        if count == 2:
            cnt += 1
            max_num = max(max_num, number)
            min_num = min(min_num, number)
        if cnt == 2:
            break

    if cnt == 2:
        result = 10 * max_num + min_num + 300
        return result
    # 8
    if 2 in number_count:
        number = number_count.index(2)
        result = 200 + number
        return result
    # 9
    max_num = 0
    for color, number in card_list:
        if max_num < number:
            max_num = number

    return 100 + max_num

전체 코드

import sys
input = sys.stdin.readline

def solve():
    # 1
    if 5 in color_count.values():
        count = 0
        max_num = 0

        for number, cnt in enumerate(number_count):

            if cnt > 0:
                count += 1
                max_num = max(max_num, number)
            else:
                count = 0
            if count == 5:
                break

        if count == 5:

            result = max_num + 900
            return result
    # 2
    elif 4 in number_count:
        number = number_count.index(4)
        result = 800 + number
        return result
    # 3
    elif 3 in number_count and 2 in number_count:
        number3 = number_count.index(3)
        number2 = number_count.index(2)
        result = number3 * 10 + number2 + 700
        return result

    # 4
    if 5 in color_count.values():
        max_num = 0
        for color, number in card_list:
            if max_num < number:
                max_num = number
        result = 600 + number
        return result

    # 5
    cnt = 0
    max_num = 0
    for number, count in enumerate(number_count):
        if count > 0:
            cnt += 1
            max_num = max(max_num, number)
        else:
            cnt = 0
        if cnt == 5:
            break
    if cnt == 5:
        result = 500 + max_num
        return result
    # 6
    if 3 in number_count:
        number = number_count.index(3)
        result = 400 + number
        return result

    # 7
    cnt = 0
    max_num = 0
    min_num = 9
    for number, count in enumerate(number_count):
        if count == 2:
            cnt += 1
            max_num = max(max_num, number)
            min_num = min(min_num, number)
        if cnt == 2:
            break

    if cnt == 2:
        result = 10 * max_num + min_num + 300
        return result
    # 8
    if 2 in number_count:
        number = number_count.index(2)
        result = 200 + number
        return result
    # 9
    max_num = 0
    for color, number in card_list:
        if max_num < number:
            max_num = number

    return 100 + max_num

card_list = []
color_count = {
    'R':0,
    'B':0,
    'Y':0,
    'G':0,
}
number_count = [0] * 10

for _ in range(5):
    color, number = map(str, input().split())
    number = int(number)
    card_list.append((color, number))

    color_count[color] += 1
    number_count[number] += 1

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

answer = solve()
print(answer)

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[백준 14002] 가장 긴 증가하는 부분 수열 4  (0) 2021.04.29
[백준 16234] 인구이동  (0) 2021.04.28
[백준 13335] 트럭  (0) 2021.04.26
[백준 10282] 해킹  (0) 2021.04.24
[백준 1238] 파티  (0) 2021.04.24