[SWEA][D3][#11806] 탐욕_베이비진 게임
작성:    
업데이트:
카테고리: SWEA D3
태그: ProblemSolving, SWEA D3, SWEA PS
출처
학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.
문제
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는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
예제
입력
3
9 9 5 6 5 6 1 1 4 2 2 1
5 3 2 9 1 5 2 0 9 2 0 0
2 8 7 7 0 2 2 2 5 4 0 3
출력
#1 0
#2 1
#3 2
My Sol
def exchange(i, k):
global checkArr
if i == k:
if check(checkArr):
return 1
return 0
for j in range(i, k):
checkArr[i], checkArr[j] = checkArr[j], checkArr[i]
if exchange(i+1, k): return 1
checkArr[i], checkArr[j] = checkArr[j], checkArr[i]
return 0
def check(arr):
l = len(arr)
s = 0
while l >= 3:
if arr[s]+1==arr[s+1] and arr[s+1]+1==arr[s+2]: return 1
if arr[s]==arr[s+1]==arr[s+2]: return 1
l -= 1
s += 1
return 0
T = int(input())
for tc in range(1, T+1):
arr = list(map(int, input().split()))
arr1, arr2 = [], []
for i in range(12):
if i%2:
arr2.append(arr[i])
else:
arr1.append(arr[i])
ans = 0
for k in range(3, 7):
checkArr = arr1[:k]
if exchange(0, k):
ans = 1
break
checkArr = arr2[:k]
if exchange(0, k):
ans = 2
break
print(f'#{tc} {ans}')
순서마다 배열을 매번 뽑아서 작성한 코드였다. 사실 급하게 문제를 풀어 제출해야 해서 효율에 대한 깊은 고민을 하지는 못했던 문제가 사실이다.
결과
PASS
모범답안
def babygin(lst):
if max(lst) >= 3:
return True
for k in range(8):
if lst[k] >= 1 and lst[k + 1] >= 1 and lst[k + 2] >= 1:
return True
for tc in range(1, int(input()) + 1):
cards = list(map(int, input().split()))
player1 = [0] * 10
player2 = [0] * 10
ans = 0
for i in range(0, len(cards), 2):
player1[cards[i]] += 1
player2[cards[i + 1]] += 1
if babygin(player1):
ans = 1
break
if babygin(player2):
ans = 2
break
print(f'#{tc} {ans}')
어차피 카드의 수는 0부터 9까지이기 때문에 index를 활용해서 카드의 장수를 세는 것이다. 수를 구분할 필요가 없기 때문에 한 인덱스의 값이 3이 되거나, 연달아 3개의 인덱스가 값이 있다면 베이비진이 성립되는 것이다.
효율적인 코드이다.
댓글남기기