[BOJ] 17081. RPG Extreme (๐Ÿ’Ž, ์‹œ๋ฎฌ๋ ˆ์ด์…˜)

lemythe423ยท2023๋…„ 9์›” 23์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
57/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

๊ณ ๋ คํ•ด์•ผ ๋  ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค.

  1. ๋ฌด๊ธฐ/๋ฐฉ์–ด๊ตฌ๋Š” ์ˆ˜์น˜์— ์ƒ๊ด€์—†์ด ์–ป์„ ๋•Œ๋งˆ๋‹ค ๊ต์ฒด๋œ๋‹ค
  2. ๋ฐฉ์–ด๊ตฌ๋Š” 4๊ฐœ ์ด์ƒ ์ฐฉ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  3. ์ด๋ฏธ ๋™์ผํ•œ ๋ฐฉ์–ด๊ตฌ๋ฅผ ์ฐฉ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์ฐฉ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  4. ์ฐฉ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ์•„์ดํ…œ ์ƒ์ž๋ฅผ ์—ด์—ˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๋นˆ ์นธ์ด ๋œ๋‹ค.
  5. ์ฃผ์ธ๊ณต์ด ์‚ฌ๋งํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋œ๋‹ค๋ฉด ๊ฐ€์‹œ ํ•จ์ • ์œ„์— ์žˆ๋”๋ผ๋„ ๋ฐ˜๋“œ์‹œ @๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค.
  6. HR๋กœ ์ฒด๋ ฅ์ด ํšŒ๋ณต๋  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ตœ๋Œ€ ์ฒด๋ ฅ๊นŒ์ง€๋งŒ ํšŒ๋ณต ๊ฐ€๋Šฅํ•˜๋‹ค.
  7. RE๋Š” ์ฃผ์ธ๊ณต์ด ๋ชฌ์Šคํ„ฐ์™€ ์ „ํˆฌ ์ค‘/๊ฐ€์‹œ ํ•จ์ •์„ ๋ฐŸ์•˜์„ ๋•Œ ์–ด๋Š ๋•Œ๋“  ์‚ฌ๋งํ•˜๋ฉด ์‚ฌ์šฉ๋˜๋ฉฐ ์ฃผ์ธ๊ณต์„ ๋ถ€ํ™œ์‹œํ‚จ ํ›„ ์†Œ๋ฉธ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ์ฐฉ์šฉ ์ค‘์ธ ๋ฐฉ์–ด๊ตฌ ๊ฐœ์ˆ˜์—์„œ 1์„ ๋นผ์•ผ ํ•œ๋‹ค.
  8. CO๋Š” ์ฒซ ๋ฒˆ์งธ ๊ณต๊ฒฉ์—์„œ๋งŒ ๊ณต๊ฒฉ๋ ฅ์„ 2๋ฐฐ๋กœ ํ•œ๋‹ค.
  9. DX์™€ CO๊ฐ€ ๋‘˜ ๋‹ค ์ฐฉ์šฉ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ DX์˜ ๊ณต๊ฒฉ๋ ฅ 3๋ฐฐ ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋œ๋‹ค.
  10. HU๋Š” ๋ณด์Šค ๋ชฌ์Šคํ„ฐ์˜ ์ฒซ ๋ฒˆ์งธ ๊ณต๊ฒฉ์—์„œ๋งŒ ๊ณต๊ฒฉ๋ ฅ ํšจ๊ณผ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ ๋‹ค.
  11. ์ฃผ์ธ๊ณต์ด ์‚ฌ๋งํ•ด์„œ ์ฒด๋ ฅ์ด ์Œ์ˆ˜๊ฐ€ ๋˜์–ด๋„ 0์œผ๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
  12. ์ „ํˆฌ ์ค‘ ์ฃผ์ธ๊ณต์ด ์‚ฌ๋งํ–ˆ๋‹ค ๋ถ€ํ™œํ•œ ๊ฒฝ์šฐ๋Š” ๋ชฌ์Šคํ„ฐ์˜ ์ฒด๋ ฅ๋„ ์›์ƒ๋ณต๊ท€ํ•ด์•ผ ํ•œ๋‹ค.

์ด ์ค‘์—์„œ 9๋ฒˆ์€ ์˜ˆ์ œ ๋ฐ˜๋ก€ ์–ด๋””์—๋„ ์—†์–ด์„œ ์ง„์งœ ์‚ฝ์งˆ ์—„์ฒญ ํ•˜๋‹ค๊ฐ€ ๋ฌธ์ œ ๋‹ค์‹œ ์ฝ๊ณ  ๊นจ๋‹ฌ์•˜๋‹ค ใ…Ž....

# RPG Extreme

from collections import defaultdict

def find_start(grid): # ์ถœ๋ฐœ ์œ„์น˜ ์ฐพ๊ธฐ
    for i in range(len(grid)):
        if '@' in grid[i]:
            return i, grid[i].index('@')

def thron(): # ๊ฐ€์‹œ ์ฐ”๋ฆฌ๊ธฐ
    global HP, RESULT, ITEMS, ITEMS_CNT
    HP -= 5+min(1, ITEMS['DX_THRON'])
    if HP <= 0:
        if ITEMS['RE']:
            revival()   
            del ITEMS['RE']
            ITEMS_CNT -= 1
            return 
        RESULT = f'YOU HAVE BEEN KILLED BY SPIKE TRAP..'

def revival(): # ์ฃผ์ธ๊ณต ์‚ฌ๋งํ•˜๋ฉด 1. ์ตœ๋Œ€ ์ฒด๋ ฅ ๋ถ€ํ™œ, 2. ์‹œ์ž‘ ์œ„์น˜๋กœ ์ด๋™
    global HP, r, c
    HP = MAX_HP
    r, c = SR, SC

def level_up():
    global HP, MAX_HP, ATT, DEF, EXP, LV
    if EXP >= 5*LV:
        EXP = 0
        LV += 1
        MAX_HP += 5
        ATT += 2
        DEF += 2
        HP = MAX_HP

def boss_battle(r, c, s, w, a, h, e): # ๋ณด์Šค ๋ชฌ์Šคํ„ฐ๋ž‘ ์‹ธ์šฐ๊ธฐ, ์ด๊ธฐ๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ
    global RESULT, grid, HP, ITEM, ITEMS_CNT, EXP
    att_alpha = 1
    if ITEMS['HU']: # HU ์žฅ์‹ ๊ตฌ ์žˆ์œผ๋ฉด ์ตœ๋Œ€ ์ฒด๋ ฅ ํšŒ๋ณต
        att_alpha = 0 # ์ฒซ ๊ณต๊ฒฉ์ด 0
        HP = MAX_HP

    h -= max(1, (ATT+W)*max(1, ITEMS['CO'], ITEMS['DX_ATT'])-a)
    while True:
        if h <= 0: # ๋ณด์Šค ๋ชฌ์Šคํ„ฐ๊ฐ€ ์ง€๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ
            RESULT = 'YOU WIN!'
            EXP = EXP+int(e*max(1, ITEMS['EX']))
            HP = min(MAX_HP, HP+ITEMS['HR'])
            level_up()
            return 
        
        HP -= (max(1, w-(DEF+A)))*att_alpha
        if HP <= 0: # ์ฃผ์ธ๊ณต์ด ์ง„ ๊ฒฝ์šฐ
            grid[r][c] = 'M'
            if ITEMS['RE']: # ๋ถ€ํ™œ ๊ฐ€๋Šฅ?
                revival()
                del ITEMS['RE']
                ITEMS_CNT -= 1
                return 
            RESULT = f'YOU HAVE BEEN KILLED BY {s}..'
            return 
        att_alpha = 1

        h -= max(1, (ATT+W)-a)

def battle(r, c, s, w, a, h, e): # ์ผ๋ฐ˜ ๋ชฌ์Šคํ„ฐ๋ž‘ ์‹ธ์šฐ๊ธฐ
    global RESULT, grid, HP, ITEM, ITEMS_CNT, EXP

    # ์ฃผ์ธ๊ณต์˜ ์ฒซ ๋ฒˆ์งธ ๊ณต๊ฒฉ
    h -= max(1, (ATT+W)*max(1, ITEMS['CO'], ITEMS['DX_ATT'])-a)
    
    while True:
        if h <= 0:
            del MONSTER[(r, c)]
            grid[r][c] = '.'
            EXP = EXP+int(e*max(1, ITEMS['EX']))
            HP = min(MAX_HP, HP+ITEMS['HR'])
            level_up()
            return
         
        # ๋ชฌ์Šคํ„ฐ์˜ ๊ณต๊ฒฉ
        HP -= max(1, w-(DEF+A))
        if HP <= 0:
            grid[r][c] = '&'
            del MONSTER[(r, c)]
            if ITEMS['RE']:
                revival()
                del ITEMS['RE']
                ITEMS_CNT -= 1
                return
            RESULT = f'YOU HAVE BEEN KILLED BY {s}..'
            return
        
        # ์ฃผ์ธ๊ณต์˜ ๊ณต๊ฒฉ
        h -= max(1, (ATT+W)*max(1, ITEMS['CO'], ITEMS['DX_ATT'])-a)

def wear_item(t, s):
    global ITEMS, ITEMS_CNT
    # ์ฐฉ์šฉํ•œ ์žฅ์‹ ๊ตฌ๊ฐ€ 4๊ฐœ๊ฑฐ๋‚˜ ๋™์ผํ•œ ์žฅ์‹ ๊ตฌ๋ฅผ ์ฐฉ์šฉ์ค‘์ธ ๊ฒฝ์šฐ
    if ITEMS_CNT == 4 or ITEMS[s]:
        return 

    ITEMS_CNT += 1
    if s == 'HR': 
        ITEMS['HR'] = 3
    elif s == 'RE':
        ITEMS['RE'] = 1
    elif s == 'CO':
        ITEMS['CO'] = 2
        if ITEMS['DX_THRON']:
            ITEMS['DX_ATT'] = 3
    elif s == 'EX':
        ITEMS['EX'] = 1.2
    elif s == 'DX':
        ITEMS['DX_THRON'] = -4
        if ITEMS['CO']:
            ITEMS['DX_ATT'] = 3
    elif s == 'HU':
        ITEMS['HU'] = 1
    elif s == 'CU':
        ITEMS['CU'] = 1
    
def open_box(r, c): # ๋ฐ•์Šค ์—ด๊ธฐ
    global W, A
    t, s = BOXES[(r, c)]
    del BOXES[(r, c)]
    
    if t == 'W':
        W = s
    elif t == 'A':
        A = s
    else:
        wear_item(t, s)
    grid[r][c] = '.'

# INIT
HP, MAX_HP, ATT, DEF, EXP, LV, W, A, ITEMS, ITEMS_CNT = 20, 20, 2, 2, 0, 1, 0, 0, defaultdict(int), 0
MOVE = {'L': (0, -1), 'R': (0, 1), 'U': (-1, 0), 'D': (1, 0)}
MONSTER, BOXES = {}, {}
ACTION = {
    '^': lambda x: thron(),
    'B': lambda x: open_box(*x),
    '&': lambda x: battle(*x, *MONSTER[*x]),
    'M': lambda x: boss_battle(*x, *MONSTER[*x])
}
RESULT = 'Press any key to continue.'

# INPUT
n, m = map(int, input().split())
grid = [list(input()) for _ in range(n)]
direction = input()
K = sum(row.count('&') for row in grid)+1
L = sum(row.count('B') for row in grid)
for _ in range(K):
    r, c, *info = map(lambda x: int(x) if x.isdigit() else x, input().split())
    MONSTER[(r-1, c-1)] = info
for _ in range(L):
    r, c, *ts = map(lambda x: int(x) if x.isdigit() else x, input().split())
    BOXES[(r-1, c-1)] = ts

SR, SC = find_start(grid)
r, c = SR, SC

# GAME_START
turns = 0
for d in direction:
    turns += 1
    dr, dc = MOVE[d]
    if grid[r][c] != '^':
        grid[r][c] = '.'

    if -1<r+dr<n and -1<c+dc<m and grid[r+dr][c+dc] != '#':
        r += dr
        c += dc
    if grid[r][c] != '.':
        ACTION[grid[r][c]]((r, c))

    if grid[r][c] != '^' and not RESULT.startswith('YOU HAVE'):
        grid[r][c] = '@'
        
    if RESULT != 'Press any key to continue.':
        break
else:
    grid[r][c] = '@'

for row in grid:
    print(''.join(row))
print(f"Passed Turns : {turns}")
print("LV :", LV)
print(f"HP : {max(0, HP)}/{MAX_HP}")
print(f"ATT : {ATT}+{W}")
print(f"DEF : {DEF}+{A}")
print(f"EXP : {int(EXP)}/{5*LV}")
# print(ITEMS, ITEMS_CNT, MONSTER)
print(RESULT)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€