In the card game poker, a hand consists of five cards and are ranked, from lowest to highest, in the following way:

  • High Card: Highest value card.
  • One Pair: Two cards of the same value.
  • Two Pairs: Two different pairs.
  • Three of a Kind: Three cards of the same value.
  • Straight: All cards are consecutive values.
  • Flush: All cards of the same suit.
  • Full House: Three of a kind and a pair.
  • Four of a Kind: Four cards of the same value.
  • Straight Flush: All cards are consecutive values of same suit.
  • Royal Flush: Ten, Jack, Queen, King, Ace, in same suit.

The cards are valued in the order:
2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace.

If two players have the same ranked hands then the rank made up of the highest value wins; for example, a pair of eights beats a pair of fives (see example 1 below). But if two ranks tie, for example, both players have a pair of queens, then highest cards in each hand are compared (see example 4 below); if the highest cards tie then the next highest cards are compared, and so on.

Consider the following five hands dealt to two players:

Hand   Player 1   Player 2   Winner
1   5H 5C 6S 7S KD
Pair of Fives
  2C 3S 8S 8D TD
Pair of Eights
  Player 2
2   5D 8C 9S JS AC
Highest card Ace
  2C 5C 7D 8S QH
Highest card Queen
  Player 1
3   2D 9C AS AH AC
Three Aces
  3D 6D 7D TD QD
Flush with Diamonds
  Player 2
4   4D 6S 9H QH QC
Pair of Queens
Highest card Nine
  3D 6D 7H QD QS
Pair of Queens
Highest card Seven
  Player 1
5   2H 2D 4C 4D 4S
Full House
With Three Fours
  3C 3D 3S 9S 9D
Full House
with Three Threes
  Player 1

The file, poker.txt, contains one-thousand random hands dealt to two players. Each line of the file contains ten cards (separated by a single space): the first five are Player 1's cards and the last five are Player 2's cards. You can assume that all hands are valid (no invalid characters or repeated cards), each player's hand is in no specific order, and in each hand there is a clear winner.

How many hands does Player 1 win?

 

포커에서는 카드 5장을 다음 순서로 등급을 매긴다.

  • 하이 카드: 가장 높은 값의 카드
  • 원 페어: 2장의 카드가 같은 값
  • 투 페어: 2개 서로 다른 페어
  • 트리플: 카드 3장이 같은 값
  • 스트레이트: 모든 카드가 연속된 숫자
  • 플러쉬: 모든 카드가 같은 무늬
  • 풀 하우스: 트리플과 원 페어
  • 포카드: 카드 4장이 같은 값
  • 스트레이트 플러쉬: 연속된 숫자이며 같은 무늬
  • 로얄 플러쉬: 10, J, Q, K, A가 같은 무늬

카드의 순서는 다음과 같다.
2, 3, 4, 5, 6, 7, 8, 9, 10, J(잭), Q(퀸), K(킹), A(에이스)

두 플레이어의 등급이 같으면 가장 높은 카드로 구성된 플레이어가 이긴다. 예를 들어, 8 페어는 5 페어를 이긴다(아래의 예시1을 참조). 그러나, 두 등급이 동일한 경우 가장 높은 카드를 비교한다(아래의 예시4 참조). 가장 높은 카드도 동일한 경우에는 다음 높은 카드를 비교하는 식으로 계속 한다.

두 플레이어 간 다음 다섯 게임을 보면:

게임   플레이어 1   플레이어 2   승자
1   5H 5C 6S 7S KD
5 페어
  2C 3S 8S 8D TD
8 페어
  플레이어 2
2   5D 8C 9S JS AC
가장 높은 카드 A
  2C 5C 7D 8S QH
가장 높은 카드 Q
  플레이어 1
3   2D 9C AS AH AC
A 트리플
  3D 6D 7D TD QD
다이아몬드 플러쉬
  플레이어 2
4   4D 6S 9H QH QC
Q 페어
가장 높은 카드 9
  3D 6D 7H QD QS
Q 페어
가장 높은 카드 7
  플레이어 1
5   2H 2D 4C 4D 4S
풀 하우스
4가 3장
  3C 3D 3S 9S 9D
풀 하우스
3이 3장
  플레이어 1

poker.txt 파일에는 1천 개의 랜덤한 두 플레이어 간 게임이 있다. 파일의 각 중에는 스페이스로 구분된 10장의 카드가 있으며, 이 중 처음 5장은 플레이어 1의 카드이고, 다음 5장은 플레이어 2의 카드이다. 모든 카드는 유효하고, 각 플레이어의 카드에는 특정 순서가 없고, 각 게임에는 분명하게 승자가 있다고 가정하자.

 

플레이어 1은 몇 번 이겼는가?

--------------------------------------------------------------------------

 

포커 게임을 실제로 만들어 보는 문제인데, 문제를 해결하는 것은 어렵지 않았는데 포커 룰을 모두 프로그래밍하는 것에 시간이 많이 필요할 것 같아 천천히 풀어봤다. 어려운 문제들을 많이 풀었기 때문에 조건문이 많이 들어가고, 동점상황 때문에 길게 프로그램을 만들어야 했지만 쉬는 기분으로 해결할 수 있었다.

 

파일을 읽어 각 게임을 문자열 하나로 만들고, 플레이어1,2의 각 숫자 갯수와 무늬를 판별해서 등급을 매기고, 그것을 기준으로 누가 이기는지 결정하면 된다.

 

숫자 갯수와 무늬를 판별하고 등급을 매기는 것이 반복되어 함수로 만들었고, 숫자 갯수는 리스트의 각 숫자 위치에 몇장 있는지 기록을 하고, 무늬는 4장 모두 같은 무늬인지만 판별하게 했다. 등급은 특정 숫자가 4개면 포카드, 3개,2개이면 풀하우스, 3개면 트리플, 2개가 2개면 투페어, 5개면 원페어이고, 연속된 숫자가 있는데 숫자가 같은 무늬이며 10,J,Q,K,A면 로얄플러쉬, 무늬만 같으면 스트레이트 플러쉬, 무늬가 다르면 스트레이트, 숫자와 관계없이 무늬가 같으면 플러쉬로 판정하면 된다. 복잡하게 썼지만 조건문으로 만들기에는 까다롭지 않았다.

 

그런데, 동점 상황일 때 높은 카드를 가진 사람이 이기는 것을 적용하기 위해 추가로 작성한 부분이 전체 코드보다 더 길게 나오는 것을 보면, 예외처리 상황이 많아 논리가 복잡하게 나왔던 것 같다. 문제에서 요구하지 않은 예외상황까지 생각하면서 너무 복잡하게 구현한 것 갈은 느낌도 들었다.


날짜 : 2014. 11. 3.

저자 : Nate Silver 저, 이경식 역

출판사 : 더퀘스트

이미지 : 예스24

정가 : 28,000원


저자의 화려한 예측 결과를 차지하고, 이 책에서 논의하는 가장 중요한 것은 '베이즈 확률론'이라고 부르는 것이다. 학교에서 통계학 수업시간에 배웠던 분산, 표준편차와 같은 개념으로 95%, 99%의 신뢰도로 현상을 분석하는 것이 아니라, 추론할 대상의 사전 확률과 추가 관측을 통하여 나온 가능도를 이용하여 사후 확률을 구하는 방식이다. 


어딘가에서 들어본 적이 있긴 하지만 정확하게 개념이 잡혀있는 것이 아니라 이해하는 것이 조금은 어려웠고, 베이즈 확률론의 가장 유명한 예시로는 '몬티 홀 문제(Monty Hall Problem)'이라는 것이 있다. 이것 또한 처음 들었을 때에는 잘 이해가 되지 않는 것이고, 지금도 가끔씩 의문이 생기고 있는 것이긴 하다.


경제, 정치, 야구, 기상, 지진, 전염병, 체스, 포커, 주식, 지구온난화, 테러라는 쉽게 이해할 만한 현상에 대한 저자의 경험과 평균과 불확실성, 베이즈 정리에 대한 설명을 잘 조합하여 직관적으로 이해되는 것은 아니긴 했지만 재미있게 볼 수 있었고,


경제 분야는 기존의 통계이론과 다르게 바라보는 나심 탈레브와 어떻게 보면 유사한 관점이며, 탈레브가 어렵게 설명한 것을 조금 더 쉽게 이해할 수 있도록 하지 않았는가 싶기도 했다.


단순한 빅데이터에 대한 책일 것으로 생각하고 읽었지만 그것보다는 조금 더 폭이 넓게, 우리 주변에 있는 소음과 신호를 어떻게 구분할 것인지, 베이즈 정리가 어떤 역할을 하는 지 잘 설명한 책이었다.

+ Recent posts