페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#4624

블랙잭 1s 256MB

문제

블랙잭은 플레이어가 딜러와 하는 게임이며 규칙이 비교적 쉬운편이다.

카드의 합이 21을 넘지 않는 한도 내에서 카드를 한 장씩 계속해서 받거나 중단하여

21에 더 가까운 사람이 이기는 게임이다. 

 

실제 규칙을 단순화하여 다음과 같이 게임을 진행해보자.

1. 딜러가 카드를 한 장 뽑아 플레이어에게 보이지 않도록 준다.

2. 딜러가 카드를 한 장 뽑아 딜러 앞에 보이지 않도록 놓는다.

3. 딜러가 카드를 한 장 뽑아 플레이어에게 보이지 않도록 준다.

4. 딜러가 카드를 한 장 뽑아 딜러 앞에 보이도록 놓는다.

5. 플레이어에게 카드를 더 받을지 말지 물어본다.

  (1) 플레이어가 최초로 받은 카드 두 장의 합이 21인 경우에는 더 이상 카드를 받지 않고, 

      딜러의 카드를 확인하여 승패를 결정한다.

  (2) 플레이어가 받은 모든 카드의 합이 21보다 작으면 계속해서 한 장씩 더 받을 수 있다.

  (3) 플레이어가 받은 모든 카드의 합이 21을 넘어가면 플레이어가 즉시 게임에서 진다.

6. 플레이어가 더 이상 카드를 받지 않으면 딜러 앞의 뒤집어 놓은 카드를 공개한 후, 

   딜러의 카드 합이 17 이상이 될 때까지 계속해서 딜러가 카드를 한 장씩 받는다.

   (1) 딜러가 받은 모든 카드의 합이 21을 넘으면 딜러가 즉시 게임에서 진다.

   (2) 이때 딜러는 플레이어가 가진 카드의 합을 고려하지 않으며, 

       딜러가 가진 카드의 합이 17 이상이 되면 받기를 중단한다.

7. 승패를 가린다. 카드 합이 21에 더 가까운 사람이 이기며, 카드 합이 서로 같으면 비긴다.

 

간단한 규칙 때문에 블랙잭에는 유명한 전략이 존재한다.

위의 5번 과정에서 딜러의 카드 중 보이는 카드에 따라 플레이어는 다음과 같은 전략을 따른다.

 

1. 딜러의 보이는 카드가 1이거나 7이상인 경우, 플레이어는 카드 합이 17 이상이 될 때까지 받는다.

2. 딜러의 보이는 카드가 4, 5, 6인 경우, 플레이어는 카드를 받지 않는다.

3. 딜러의 보이는 카드가 2, 3인 경우, 플레이어는 카드 합이 12 이상이 될 때까지 받는다.

 

블랙잭 룰에 따라 J, Q, K에 해당하는 11, 12, 13은 모두 10으로 치환하여 생각한다.

A에 해당하는 1은 1 또는 11로 치환이 가능하며 카드를 가진 사람에게 유리하게 적용할 수 있다.

예를 들어, 카드 합을 적어도 17 이상으로 만들고 싶을 때 카드가 [1, 6]이면 1을 11로 치환하여

카드 합을 17로 계산할 수 있다. 만약 카드가 [1, 5, 10] 일때는 1을

그대로 1로 사용함으로써 카드 합을 16으로 계산할 수 있다.

 

딜러와 플레이어 모두 1 카드를 11로 치환하여 원하는 카드 합을 만들 수 있다면 항상 11로 바꾸어 계산한다.

예를 들어, 원하는 카드 합이 17이상이고 플레이어의 카드가 [5, 1, 1]인 경우,

1 한 장만 11로 치환한다면 카드 합이 17이고, 두 장 모두 1로 사용한다면 카드 합이 7이다.

이때 플레이어는 카드 합을 7로 계산해서 뒤에 더 좋은 카드를 받는 것을 기대할 수도 있지만, 

여기에서는 17로 계산하고 더 이상 카드를 받지 않는다.

 

[10, 1]과 같이 처음 받은 두 카드의 합이 21이면 블랙잭이라고 한다.(5.1번 규칙)

플레이어가 블랙잭일 경우 바로 딜러의 카드를 확인하여 딜러가 블랙잭이 아니라면

(즉, 딜러의 카드 두 장의 합이 21이 아니라면) 플레이어가 승리하며, 베팅한 금액의 1.5배를 받는다.

플레이어가 게임에서 진 경우에는 항상 베팅한 금액 만큼만 잃는다.

서로 비긴 경우에는 돈을 따지도 잃지도 않는다.

 

플레이어는 게임에서 이기면 2원을 얻고, 지면 2원을 잃는다.

또, 블랙잭으로 승리한 경우에는 3원을 얻는다. 처음에 플레이어가 가진 돈은 0원에서 시작하며, 

돈은 음수가 될 수 있다고 가정한다. 뽑을 카드들을 순서대로 나타내는 수열 cards[]가 주어진다.

위의 전략대로 플레이할 경우, 모든 게임이 끝나고 플레이어가 가진 돈의 액수를

반환하도록 프로그램을 작성하시오.

 


입력

첫 행에 cards[]의 길이 N이 주어진다. (1 <= N <= 10,000)

다음 행에 cards[]의 원소 cards[i]가 공백으로 구분되어 주어진다.

 ( 1 <= cards[i] <= 13)

 


출력

모든 게임이 끝나고 플레이어가 가진 돈의 액수를 출력한다.

더 이상 카드를 뽑을 수 없는 경우 해당 게임을 무효처리하고 종료한다.

무효 처리된 게임에서는 돈을 따지도, 잃지도 않는다.​ 


예제 #1

6

12 7 11 6 2 12
2

예제 #2

8

1 4 10 6 9 1 8 13
1

예제 #3

10

10 13 10 1 2 3 4 5 6 2
-2

예제 #4

10

3 3 3 3 3 3 3 3 3 3
-2


출처

LINE2020_2 5번 | dnfka0930
로그인해야 코드를 작성할 수 있어요.