본문 바로가기

Algorithm

SWEA 5203 베이비진 게임 (python)

반응형

5203. [파이썬 S/W 문제해결 구현] 3일차 - 베이비진 게임 D3

 

[파이썬 S/W 문제해결 구현] 3일차

2021.04.20 - [분류 전체보기] - SWEA 5201 컨테이너 운반 (python)

2021.04.20 - [분류 전체보기] - SWEA 5202 화물도크 (python)

문제

0부터 9까지인 숫자 카드 4세트를 섞은 후 6개의 카드를 골랐을 때, 연속인 숫자가 3개 이상이면 run, 같은 숫자가 3개 이상이면 triplet이라고 한다.

게임을 시작하면 플레이어1과 플레이어 2가 교대로 한 장 씩 카드를 가져가며, 6장을 채우기 전이라도 먼저 run이나 triplet이 되는 사람이 승자가 된다.

두 사람이 가져가게 되는 순서대로 12장의 카드에 대한 정보가 주어졌을 때 승자를 알아내는 프로그램을 작성하시오. 만약 무승부인 경우 0을 출력한다.

예를 들어 9 9 5 6 5 6 1 1 4 2 2 1인 경우, 플레이어 1은 9, 5, 5, 1, 4, 2카드를, 플레이어2는 9, 6, 6, 1, 2, 1을 가져가게 된다.

이때는 카드를 모두 가져갈 때 까지 run이나 triplet이 없으므로 무승부가 된다.

[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 각 줄에 0에서 9사이인 12개의 숫자가 주어진다.

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

풀이 과정

T = int(input())

def check(player):
    for j in range(len(player)):
        if player[j] == 3:
            return True

    for k in range(len(player)-3):
        if player[k] and player[k+1] and player[k+2]:
            return True

    return False

for tc in range(1, T+1):
    cards = list(map(int, input().split()))

    p1 = [0]*10
    p2 = [0]*10
    winner = 0


    for i in range(len(cards)):

        if not i % 2:
            p1[cards[i]] += 1
            if check(p1):
                winner = 1
                break
        else:
            p2[cards[i]] += 1
            if check(p2):
                winner = 2
                break


    print("#{} {}".format(tc, winner))
  • 이렇게 풀었더니 10개의 테스트 케이스중에서 1개가 틀림
  • 혹시나 9 ,0 , 1 같은 경우가 있는가 싶어서 해봤지만 어림없었다.
  • 둘다 이겨서 무승부 나는 경우에도 똑같이 1개가 틀렸다.
  •  for i in range(len(cards)):
            if winner:
                break
    
            if not i % 2:
                p1[cards[i]] += 1
                if check(p1):
                    winner.append(1)
    
            else:
                p2[cards[i]] += 1
                if check(p2):
                    winner.append(2)
    
        if not winner:
            result = 0
        else:
            if len(winner) == 2:
                result = 0
            elif winner[0] == 1:
                result = 1
            else:
                result = 2
  • 함수에 문제가 있는것으로 추측

풀이

T = int(input())

# 이겼는지 체크를 위한 함수
def check(player):
    # 10장을 돌면서검사
    for j in range(10):
        # 만약 같은 카드를 3장 가지고 있으면 이겼음
        if player[j] == 3:
            return True
    # 마지막 7,8,9 까지만 검사
    for k in range(8):
        # 연속된다면 이겼으니까 종료
        if player[k] and player[k + 1] and player[k + 2]:
            return True
    # 승리요건 달성 못함
    return False


for tc in range(1, T + 1):
    cards = list(map(int, input().split()))

    # 각각의 인덱스가 카드번호가 되도록 플레이어들 초기값 생성
    p1 = [0] * 10
    p2 = [0] * 10
    # 처음 시작은 비기는 걸로
    winner = 0

    # 주어진 카드를 한장씩 나눠주자
    for i in range(len(cards)):
        # 먼저 p1부터 받는다. (짝수)
        if not i % 2:
            # 카드 번호에 해당하는 p1의 인덱스에 카드 장수를 늘려준다.
            p1[cards[i]] += 1
            # 승리조건을 만족했다면
            if check(p1):
                # 승자! 후 종료
                winner = 1
                break
        else:
            # p2도 p1과 같이 동일한 검정 과정
            p2[cards[i]] += 1
            if check(p2):
                winner = 2
                break

    print("#{} {}".format(tc, winner))

후기

다 필요없고 범위가 틀렸다. 따라서 7,8,9를 검사해내지 못했었다.

그래서 테스트 케이스 한개가 틀렸다.

그러므로

인덱스 범위를 직관적으로 표현할수 있다면 직관적으로 표현하던가

아니면 범위를 꼭 확인하자... 아직도 기본이 덜되어있네..🤬

반응형

'Algorithm' 카테고리의 다른 글

BOJ 9020 골드바흐의 추측 (python)  (0) 2021.04.20
SWEA 11454 Baby-gin Game (python)  (0) 2021.04.20
SWEA 5202 화물도크 (python)  (0) 2021.04.20
SWEA 5201 컨테이너 운반 (python)  (0) 2021.04.20
BOJ 11501 주식 (python)  (0) 2021.04.20