[SWEA 5203번] 베이비진 게임 (파이썬 풀이)
도깨비젤리
·2021. 6. 3. 21:54
문제 바로 가기
🤔 문제 설명 및 입출력
- 문제의 저작권은 SWEA에 있습니다 -
✍ 접근 방법
탐욕 알고리즘이 언제나 그렇듯 푸는 방법도 참 다양하고, 유형도 참 다양하다. 근데 놀랍게도 대부분의 경우 머리 속에 즉흥적으로 떠오른 생각을 그대로 구현하면 해결되는 경우가 많다.
이번 문제를 풀면서 떠오른 생각은 플레이어 1 / 2에게 카드패를 한장 씩 나누어주다가, triplet이나 run이 발생하면 check를 하여 승리자로 만들게 하는 것이다.
그러기 위해서 아래와 같은 접근을 취했다.
1. 입력을 각 플레이어가 받을 카드 리스트로 변환함
2. 리스트를 for문으로 순회하면서, 어떤 숫자가 나왔는지 count
3.1 count 하다가, 3개의 연속된 숫자가 count 되었다면 run 발생
3.2 count 하다가, 같은 숫자가 3번 연속 count 되었다면 triplet 발생
4. 먼저 발생한 플레이어가 승리, 만약 순회가 끝났다면 무승부 출력
위 흐름을 머리속으로 따라가며 구현해보자.
👨💻 소스 코드
- 파이썬
# 플레이어의 현재 패가 babygin 인지 확인하는 함수
def babygin(lst:list)->bool:
run = triplet = False
arr = [0]*(12)
for elem in lst:
arr[elem] += 1
if arr[elem] >= 3:
triplet = True
arr[elem] -= 3
for idx in range(10):
if arr[idx] >= 1 and arr[idx+1] >=1 and arr[idx+2] >= 1:
run = True
if run or triplet:
return True
else:
return False
TC = int(input())
for tc in range(1,TC+1):
card_lst = list(map(int,input().split()))
# 플레이어 1 이 받을 모든 카드들
card_1 = card_lst[::2]
# 플레이어 2가 받을 모든 카드들
card_2 = card_lst[1::2]
ans = 0
# 매 루프마다 한장씩 추가로 드로우 합니다.
# 3장 이하에서는 죽었다 깨어도 run/triplet 을 만족할 수 없으니,
# 기본 3장씩 드로우 한 상태에서 시작합니다.
# idx는 6까지 가는데, idx는 리스트 슬라이싱에 사용되므로, 카드 리스트의 인덱스 최대 크기보다 1만큼 더 커야지
# 플레이어 카드 풀 전체를 조사할 수 있습니다.
for idx in range(3,7):
player_1 = babygin(card_1[:idx])
if player_1:
ans = 1
break
player_2 = babygin(card_2[:idx])
if player_2:
ans = 2
break
print('#{0} {1}'.format(tc,ans))
🔥 강평
사실 이 문제는 나한테 참 의미가 깊은 문제이다.
내가 이 문제를 처음 본 것은 SSAFY 스타트 캠프 때이다. 그때 교육생들에게 잠시 풀이법 생각해보라고 시간을 줬던 기억이 나는데, 당시의 나는 "파이썬 독학 빡세게 했으니까, 이런 스타트 캠프에서 보여주는 문제는 껌이지~" 라는 생각으로 도전했다. 물론 결과는 참담했다.
아무튼 그런 씁쓸한 기억을 가지고 학기를 시작했고, 이 문제는 웹 과정을 하는 동안 내 머릿속에서 깔끔히 사라졌었다.
그리고 3개월이 지나고, 알고리즘 수업 시간에 다시 이 문제를 만나게 되었다. 그리고 놀랍게도, 3개월 전에는 어떻게 해도 답이 안보였던 문제가 나도 모르게 스르륵 풀리는 마법과 같은 경험을 하게 되었다.
딱히 어려운 문제는 아니지만, 만화에서나 보던 폐관수련의 효과를 내 몸으로 느낀 문제라 특히 애착이 가는 것일지도 모르겠다.
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA 1859번] 백만 장자 프로젝트 (파이썬 풀이) (2) | 2021.06.09 |
---|---|
[SWEA 1251번] 하나로 (파이썬 풀이) (0) | 2021.06.03 |