Stay Hungry Stay Foolish

SWEA

[SWEA] 1873. 상호의 배틀필드 (Python/D3)

dev스카이 2024. 11. 13. 23:40

[문제 링크] 👇

 

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에 있을만한 난이도는 맞는데 코테 연습용으로 풀기에는 좋은 문제는 아닌 것 같다.. 시간 낭비하는 느낌