๋ฐฑ์ค€ 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 ์‚ฌ์ด์˜ ์ •์ˆ˜๋กœ, ์„ ํƒํ•œ ์กฑ๋ณด๋ฅผ ๋‚˜ํƒ€๋ƒ„

ํ•จ์ˆ˜๋Š” ๊ฐ ์กฑ๋ณด ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋กœ์ง์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. 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์ด ์ฐพ๊ณ ์ž ํ•˜๋Š” ์ฃผ์‚ฌ์œ„ ๋ˆˆ ๊ฐ’
  • ํ•ด๋‹น ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฃผ์‚ฌ์œ„ ๋ˆˆ๋“ค์˜ ํ•ฉ์„ ๋ฐ˜ํ™˜
  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์ ์„ ๋ฐ˜ํ™˜
  1. 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์ ์„ ๋ฐ˜ํ™˜

  1. 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์ ์„ ๋ฐ˜ํ™˜

  1. 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์ ์„ ๋ฐ˜ํ™˜

  1. 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())