๋ฐฑ์ค BOJ 27162 Yacht Dice ๋ฌธ์ ์ ํ์ด์ฌ python ํ์ด์ ๋๋ค.
https://www.acmicpc.net/problem/25204
๋ฌธ์
ใYacht Diceใ๋ ์ฌ๋ฌ ๋ช ์ด ํ๋ ์ดํ๋ ์ฃผ์ฌ์ ๊ฒ์์ ๋๋ค. ํ๋ ์ด์ด๋ ์ฐ์ ์ฃผ์ฌ์๋ฅผย ๊ฐ ๊ตด๋ฆฝ๋๋ค. ์ดํ ์ํ๋ ์ฃผ์ฌ์๋ฅผ ๊ณ ์ ์ํจ ๋ค, ๋จ์ ์ฃผ์ฌ์๋ฅผ ๋ค์ ๊ตด๋ฆฌ๋ ์ผ์ ๋ ๋ฒ ์ดํ๋ก ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ๊ฐ๋ค์ ์กฐํฉ์ผ๋ก ์๋ ์กฑ๋ณด์์ ์ด์ ๊น์ง ์ ํํ์ง ์์ ํ๋๋ฅผ ์ ํํด ์ ์๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- Ones:ย ์ด ๋์จ ์ฃผ์ฌ์์ ๋ ์์ ์ดํฉ.
- Twos:ย ๊ฐ ๋์จ ์ฃผ์ฌ์์ ๋ ์์ ์ดํฉ.
- Threes:ย ์ด ๋์จ ์ฃผ์ฌ์์ ๋ ์์ ์ดํฉ.
- Fours:ย ๊ฐ ๋์จ ์ฃผ์ฌ์์ ๋ ์์ ์ดํฉ.
- Fives:ย ๊ฐ ๋์จ ์ฃผ์ฌ์์ ๋ ์์ ์ดํฉ.
- Sixes:ย ์ด ๋์จ ์ฃผ์ฌ์์ ๋ ์์ ์ดํฉ.
- Four of a Kind: ๋์ผํ ์ฃผ์ฌ์ ๋์ด ๊ฐ ์ด์**์ด๋ผ๋ฉด, ๋์ผํ ์ฃผ์ฌ์ ๋ ๊ฐ์ ์ดํฉ. ์๋๋ผ๋ฉดย ์ .
- Full House: ์ฃผ์ฌ์ ๋์ดย ์ ํํ ๋ ์ข ๋ฅ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ ํ ์ข ๋ฅ๋ย ๊ฐ, ๋ค๋ฅธ ์ข ๋ฅ๋ย ๊ฐ์ผ ๋, ์ฃผ์ฌ์ ๋ย ๊ฐ์ ์ดํฉ. ์๋๋ผ๋ฉดย ์ .
- Little Straight: ์ฃผ์ฌ์ ๋์ดย ,ย ,ย ,ย ,ย ์ ์กฐํฉ์ด๋ผ๋ฉด, ์ฆย ์์ย ๊น์ง์ ๋์ด ํ ๋ฒ์ฉ ๋ฑ์ฅํ๋ค๋ฉดย ์ , ์๋๋ผ๋ฉดย ์ .
- Big Straight: ์ฃผ์ฌ์ ๋์ดย ,ย ,ย ,ย ,ย ์ ์กฐํฉ์ด๋ผ๋ฉด, ์ฆย ์์ย ๊น์ง์ ๋์ด ํ ๋ฒ์ฉ ๋ฑ์ฅํ๋ค๋ฉดย ์ , ์๋๋ผ๋ฉดย ์ .
- Yacht: ๋์ผํ ์ฃผ์ฌ์ ๋์ดย ๊ฐ๋ผ๋ฉดย ์ , ์๋๋ผ๋ฉดย ์ .
- Choice: ๋ชจ๋ ์ฃผ์ฌ์ ๋์ ์ดํฉ.
๋ชจ๋ ํ๋ ์ด์ด์ ๋ชจ๋ ์กฑ๋ณด๊ฐ ์ฌ์ฉ๋๋ฉด ๊ฒ์์ด ๋๋ฉ๋๋ค.
์ง๊ธ์ ํ๋ณ์ด ์ฐจ๋ก์
๋๋ค. ํ๋ณ์ด๋ ์ฒซ ๋ฒ์งธ๋ก ๊ตด๋ฆฐ ์ฃผ์ฌ์์ ์กฐํฉ์์ ์ธ ๊ฐ์ ์ฃผ์ฌ์๋ฅผ ๊ณ ์ ํ๊ณ ๋๋จธ์ง ๋ ๊ฐ์ ์ฃผ์ฌ์๋ฅผ ๋ค์ ๊ตด๋ ค์ผ ํ๋ ์ํฉ์
๋๋ค. ์ด ์ํฉ์์ ๋์ฌ ์ ์๋ ์ ์์ ์ต๋๊ฐ์ ์ผ๋ง์ผ๊น์?
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ด๋ฏธ ์ ํํ ์กฑ๋ณด๋ฅผ ์๋ฏธํ๋ย ๊ธ์์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋๋ค. ๋ฌธ์์ด์ ๋ชจ๋ ๊ธ์๋ย Y
ย ๋๋ย N
์ด๋ฉฐ, ๊ธ์๋ค ์ค ์ ์ด๋ ํ๋๋ย Y
์
๋๋ค.
- โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Ones๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋กย ๋ฒ์งธ ๊ธ์๊น์ง ๊ฐ์ ๊ท์น์ด ์ ์ฉ๋์ด,ย ๋ฒ์งธ ๊ธ์๊ฐยY
๋ผ๋ฉดย Sixes๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Four of a Kind๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Full House๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Little Straight๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Big Straight๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Yacht๋ฅผ ์ ํํ ์ ์์ต๋๋ค. - โ๋ฒ์งธ ๊ธ์๊ฐย
Y
๋ผ๋ฉดย Choice๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
๊ฐ๊ฐ์ ๊ฒฝ์ฐ์์ ๊ธ์๊ฐย N
์ด๋ผ๋ฉด ํด๋นํ๋ ์กฑ๋ณด๋ฅผ ์ด๋ฏธ ์ ํํ์ฌ ๋ค์ ์ ํํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ ๋ฒ์งธ ์ค์๋ ํ๋ณ์ด๊ฐ ์ฒซ ๋ฒ์งธ๋ก ๊ตด๋ฆฐ ์กฐํฉ์์ ๊ณ ์ ํ ์ฃผ์ฌ์๋ค์ ๋์ ์๋ฅผ ๋ํ๋ด๋ย ๊ณผย ย ์ฌ์ด์ ์ ์ย ๊ฐ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋๋ค.
์ถ๋ ฅ
ํ๋ณ์ด๊ฐ ์ป์ ์ ์๋ ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
ํ์ด
compute_score ํจ์
์ด ํจ์๋ ์ฃผ์ฌ์ ์กฐํฉ๊ณผ ์ ํํ ์กฑ๋ณด์ ๋ฐ๋ผ ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
def compute_score(dice, category_idx):
dice
: 5๊ฐ์ ์ฃผ์ฌ์ ๋์ ๋ด์ ๋ฆฌ์คํธcategory_idx
: 0-11 ์ฌ์ด์ ์ ์๋ก, ์ ํํ ์กฑ๋ณด๋ฅผ ๋ํ๋
ํจ์๋ ๊ฐ ์กฑ๋ณด ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ก์ง์ ์ ์ฉํฉ๋๋ค.
- Ones๋ถํฐ Sixes๊น์ง (์ธ๋ฑ์ค 0-5)
if 0 <= category_idx <= 5: # Ones to Sixes
target = category_idx + 1
return sum(d for d in dice if d == target)
category_idx + 1
์ด ์ฐพ๊ณ ์ ํ๋ ์ฃผ์ฌ์ ๋ ๊ฐ- ํด๋น ๊ฐ๊ณผ ์ผ์นํ๋ ์ฃผ์ฌ์ ๋๋ค์ ํฉ์ ๋ฐํ
- Four of a Kind (์ธ๋ฑ์ค 6)
elif category_idx == 6: # Four of a Kind
for value in range(1, 7):
if dice.count(value) >= 4:
return value * 4
return 0
- ๊ฐ์ ๋์ด 4๊ฐ ์ด์์ธ ๊ฒฝ์ฐ, ๊ทธ ๋ ร 4๋ฅผ ๋ฐํ
- ์์ผ๋ฉด 0์ ์ ๋ฐํ
- Full House (์ธ๋ฑ์ค 7)
elif category_idx == 7: # Full House
counts = {}
for d in dice:
counts[d] = counts.get(d, 0) + 1
values = list(counts.values())
if len(counts) == 2 and (3 in values and 2 in values):
return sum(dice)
return 0
- ์ฃผ์ฌ์ ๋์ ๋ฑ์ฅ ํ์๋ฅผ ๋์ ๋๋ฆฌ์ ์ ์ฅ
- ๋์ ๋๋ฆฌ์ ๊ธธ์ด๊ฐ 2(๋ ์ข ๋ฅ์ ๋๋ง ์์)์ด๊ณ , ํ ์ข ๋ฅ๋ 3๋ฒ, ๋ค๋ฅธ ์ข ๋ฅ๋ 2๋ฒ ๋ฑ์ฅํ๋ค๋ฉด ๋ชจ๋ ์ฃผ์ฌ์์ ํฉ์ ๋ฐํ
- ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด, 0์ ์ ๋ฐํ
- Little Straight (์ธ๋ฑ์ค 8)
elif category_idx == 8: # Little Straight
if sorted(dice) == [1, 2, 3, 4, 5]:
return 30
return 0
- ์ฃผ์ฌ์ ๋์ด 1๋ถํฐ 5๊น์ง ๋ชจ๋ ์์ผ๋ฉด 30์ ์ ๋ฐํ
- ์๋๋ฉด 0์ ์ ๋ฐํ
- Big Straight (์ธ๋ฑ์ค 9)
elif category_idx == 9: # Big Straight
if sorted(dice) == [2, 3, 4, 5, 6]:
return 30
return 0
- ์ฃผ์ฌ์ ๋์ด 2๋ถํฐ 6๊น์ง ๋ชจ๋ ์์ผ๋ฉด 30์ ์ ๋ฐํ
- ์๋๋ฉด 0์ ์ ๋ฐํ
- Yacht (์ธ๋ฑ์ค 10)
elif category_idx == 10: # Yacht
if len(set(dice)) == 1:
return 50
return 0
- ๋ชจ๋ ์ฃผ์ฌ์ ๋์ด ๊ฐ์ผ๋ฉด(์งํฉ์ ํฌ๊ธฐ๊ฐ 1์ด๋ฉด) 50์ ์ ๋ฐํ
- ์๋๋ฉด 0์ ์ ๋ฐํ
Choice (์ธ๋ฑ์ค 11):
elif category_idx == 11: # Choice
return sum(dice)
- ๋ชจ๋ ์ฃผ์ฌ์ ๋์ ํฉ์ ๋ฐํ
์๊ฐ ๋ณต์ก๋ ๋ถ์
- ๋จ์ ๋ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฌ๋ ๊ฒฝ์ฐ์ ์: 6 ร 6 = 36
- ๊ฐ ๊ฒฝ์ฐ๋ง๋ค ์ต๋ 12๊ฐ์ ์กฑ๋ณด๋ฅผ ํ์ธ: 36 ร 12 = 432
- ๊ฐ ์กฑ๋ณด๋ง๋ค ์ ์ ๊ณ์ฐ์ O(1) ๋๋ O(n) ์๊ฐ์ด ์์๋จ (์ฌ๊ธฐ์ n์ ์ฃผ์ฌ์ ๊ฐ์ 5, ์์ ์ทจ๊ธ ๊ฐ๋ฅ)
- ๋ฐ๋ผ์ ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(36 ร 12 ร 5) = O(2160) = O(1)
์์ ๊ฒ์ฆ
def test_examples():
# ์์ 1
example1_available = "YYYYYYYYYYYN"
example1_fixed = [1, 5, 6]
available_categories1 = [i for i in range(12) if example1_available[i] == 'Y']
max_score1 = 0
best_dice1 = []
best_category1 = -1
for d1 in range(1, 7):
for d2 in range(1, 7):
current_dice = example1_fixed.copy() + [d1, d2]
for category in available_categories1:
score = compute_score(current_dice, category)
if score > max_score1:
max_score1 = score
best_dice1 = current_dice
best_category1 = category
print(f"์์ 1 ์ต๋ ์ ์: {max_score1}")
print(f"์ต์ ์ฃผ์ฌ์: {best_dice1}, ์ฌ์ฉ ์กฑ๋ณด: {best_category1}")
# ์์ ํ
์คํธ
test_examples()
์ ์ฒด ์ฝ๋
# 25204 ๋ฌธ์์ด ์ ๋ ฌ
def compute_score(dice, category_idx):
if 0 <= category_idx <= 5: # Ones to Sixes
target = category_idx + 1
return sum(d for d in dice if d == target)
elif category_idx == 6: # Four of a Kind
for value in range(1, 7):
if dice.count(value) >= 4:
return value * 4
return 0
elif category_idx == 7: # Full House
counts = {}
for d in dice:
counts[d] = counts.get(d, 0) + 1
values = list(counts.values())
if len(counts) == 2 and (3 in values and 2 in values):
return sum(dice)
return 0
elif category_idx == 8: # Little Straight
if sorted(dice) == [1, 2, 3, 4, 5]:
return 30
return 0
elif category_idx == 9: # Big Straight
if sorted(dice) == [2, 3, 4, 5, 6]:
return 30
return 0
elif category_idx == 10: # Yacht
if len(set(dice)) == 1:
return 50
return 0
elif category_idx == 11: # Choice
return sum(dice)
return 0
def solve():
# ์ ํ ๊ฐ๋ฅํ ์กฑ๋ณด ์ฝ๊ธฐ
available = input().strip()
available_categories = [i for i in range(12) if available[i] == 'Y']
# Y๊ฐ ์๋ ์์น์ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌ์คํธ์ ์ ์ฅ
# ๊ณ ์ ๋ ์ฃผ์ฌ์ ์ฝ๊ธฐ
fixed_dice = list(map(int, input().strip().split()))
max_score = 0
# ๋จ์ ๋ ์ฃผ์ฌ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์๋ฎฌ๋ ์ด์
(1-6, 1-6) => 36๊ฐ์ง ๋ชจ๋ ํ์ธ
for d1 in range(1, 7):
for d2 in range(1, 7):
current_dice = fixed_dice.copy() + [d1, d2]
# ๊ฐ ์ ํ ๊ฐ๋ฅํ ์กฑ๋ณด์ ๋ํ ์ ์ ๊ณ์ฐ
for category in available_categories:
score = compute_score(current_dice, category)
max_score = max(max_score, score)
return max_score
print(solve())