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 |