๐Ÿงฉ Algorithm/SWEA

[SWEA] 1873. ์ƒํ˜ธ์˜ ๋ฐฐํ‹€ํ•„๋“œ (Python/D3)

devCloud 2024. 11. 13. 23:40
728x90

[๋ฌธ์ œ ๋งํฌ] ๐Ÿ‘‡

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


Solution

# ๋ฐฉํ–ฅ์— ๋”ฐ๋ฅธ ์ „์ฐจ ๋ชจ์–‘ ๋ฐ ์ด๋™ (๋ถ, ๋‚จ, ์„œ, ๋™)
tank_direction = {'^': 0, 'v': 1, '<': 2, '>': 3}
direction_symbols = ['^', 'v', '<', '>']
dx = [-1, 1, 0, 0]  # ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ด๋™ (๋ถ, ๋‚จ, ์„œ, ๋™)
dy = [0, 0, -1, 1]

# ๋ช…๋ น์–ด ์ˆ˜ํ–‰
def execute_commands(H, W, game_map, commands):
    # ์ „์ฐจ ์œ„์น˜ ์ฐพ๊ธฐ
    for i in range(H):
        for j in range(W):
            if game_map[i][j] in tank_direction:
                x, y = i, j
                direction = tank_direction[game_map[i][j]]
                game_map[i][j] = '.'

    # ๋ช…๋ น์–ด ์ˆ˜ํ–‰
    for command in commands:
        if command == 'S':  # ํฌํƒ„ ๋ฐœ์‚ฌ
            nx, ny = x, y
            while True:
                nx += dx[direction]
                ny += dy[direction]
                if nx < 0 or nx >= H or ny < 0 or ny >= W:
                    break
                if game_map[nx][ny] == '#':
                    break
                if game_map[nx][ny] == '*':
                    game_map[nx][ny] = '.'
                    break
        else:  # ์ด๋™ ๋ช…๋ น
            direction = {'U': 0, 'D': 1, 'L': 2, 'R': 3}[command]
            game_map[x][y] = direction_symbols[direction]
            nx, ny = x + dx[direction], y + dy[direction]
            if 0 <= nx < H and 0 <= ny < W and game_map[nx][ny] == '.':
                x, y = nx, ny

    # ์ „์ฐจ ์œ„์น˜ ํ‘œ์‹œ
    game_map[x][y] = direction_symbols[direction]
    return game_map

# ๋ฉ”์ธ ํ•จ์ˆ˜
T = int(input())
for test_case in range(1, T + 1):
    H, W = map(int, input().split())
    game_map = [list(input().strip()) for _ in range(H)]
    N = int(input())
    commands = input().strip()
    
    # ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ํ›„ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    result_map = execute_commands(H, W, game_map, commands)
    print(f"#{test_case}")
    for row in result_map:
        print("".join(row))

 

๋‚ด ํ’€์ด

def up(board, x, y):
    # ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜, ๋ฒฝ์ด๊ฑฐ๋‚˜, ๋ฌผ์ผ ๋•Œ ์ด๋™ ๊ธˆ์ง€
    if x - 1 >= 0 and board[x-1][y] != '#' and board[x-1][y] != '*' and board[x-1][y] != '-':
        board[x][y] = '.'
        board[x - 1][y] = '^'
        return board, x - 1, y

    board[x][y] = '^'
    return board, x, y

def down(board, x, y):
    if x + 1 < H and board[x+1][y] != '#' and board[x+1][y] != '*' and board[x+1][y] != '-':
        board[x][y] = '.'
        board[x + 1][y] = 'v'
        return board, x + 1, y

    board[x][y] = 'v'
    return board, x, y

def left(board, x, y):
    if y - 1 >= 0 and board[x][y - 1] != '#' and board[x][y - 1] != '*' and board[x][y - 1] != '-':
        board[x][y] = '.'
        board[x][y - 1] = '<'
        return board, x, y - 1

    board[x][y] = '<'
    return board, x, y

def right(board, x, y):
    if y + 1 < W and board[x][y + 1] != '#' and board[x][y + 1] != '*' and board[x][y + 1] != '-':
        board[x][y] = '.'
        board[x][y + 1] = '>'
        return board, x, y + 1

    board[x][y] = '>'
    return board, x, y

def shoot(board, x, y):
    if board[x][y] == '>':
        for i in range(y + 1, W):
            if board[x][i] == '*':
                board[x][i] = '.'
                return board, x, y
            elif board[x][i] == '#':
                return board, x, y
    elif board[x][y] == '<':
        for i in range(y - 1, -1, -1):
            if board[x][i] == '*':
                board[x][i] = '.'
                return board, x, y
            elif board[x][i] == '#':
                return board, x, y
    elif board[x][y] == '^':
        for i in range(x - 1, -1, -1):
            if board[i][y] == '*':
                board[i][y] = '.'
                return board, x, y
            elif board[i][y] == '#':
                return board, x, y
    elif board[x][y] == 'v':
        for i in range(x + 1, H):
            if board[i][y] == '*':
                board[i][y] = '.'
                return board, x, y
            elif board[i][y] == '#':
                return board, x, y
    return board, x, y

T = int(input())  # ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜
for test_case in range(1, T + 1):
    H, W = map(int, input().split())
    board = [list(input().strip()) for _ in range(H)]
    N = int(input())
    command = input().strip()
    x, y = 0, 0
    for i in range(H):
        for j in range(W):
            if board[i][j] == '^' or board[i][j] == 'v' or board[i][j] == '<' or board[i][j] == '>':
                x, y = i, j  # ์ „์ฐจ ํ˜„์žฌ ์œ„์น˜ ์ €์žฅ
                break

    for i in command:
        if i == 'U':
            board, x, y = up(board, x, y)
        elif i == 'D':
            board, x, y = down(board, x, y)
        elif i == 'L':
            board, x, y = left(board, x, y)
        elif i == 'R':
            board, x, y = right(board, x, y)
        elif i == 'S':
            board, x, y = shoot(board, x, y)

    print(f"#{test_case}", end=' ')
    for i in board:
        print(''.join(i))

๐Ÿ‘ฉ‍๐Ÿ’ป ํšŒ๊ณ 

D3์— ์žˆ์„๋งŒํ•œ ๋‚œ์ด๋„๋Š” ๋งž๋Š”๋ฐ ์ฝ”ํ…Œ ์—ฐ์Šต์šฉ์œผ๋กœ ํ’€๊ธฐ์—๋Š” ์ข‹์€ ๋ฌธ์ œ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.. ์‹œ๊ฐ„ ๋‚ญ๋น„ํ•˜๋Š” ๋А๋‚Œ


 

728x90