Algorithm/Simulation

[Python] SWEA 1873번 상호의 배틀필드

코딩쪼앙 2023. 5. 10. 17:00

문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제 풀이

  • 이동하기 편하도록 전차의 방향, 이동 방향, 이동하는 방향에 따른 좌표들을 저장한다.
  • 전차가 있는 곳이 시작하는 위치이므로, 시작위치와 전차의 방향을 구한다.
  • 그 후, 크게 포탄을 발사하는 경우와, 포탄을 발사하지 않고, 이동하는 두 가지 경우로 나눈 후, 포탄을 발사하는 경우, 벽돌과 강철에 부딪히는 경우 처리 해준다. 
    • 벽돌에 부딪히는 경우 벽돌 부분을 평지로 바꾼 후, break 해줘야 하고, 강철에 부딪히는 경우 아무런 일도 일어나지 않으므로, 그냥 break 해 줘야 한다.
  • 포탄을 발사하지 않는 경우는 이동 방향에 따라 이동한 후, 이동을 마친 후, 최종 위치에 전차의 방향을 구해 전차를 놓는다.
  • 출력 형식에 맞게 출력한다.

코드

# 상하좌우
car_direction_list = ['^', 'v', '<', '>']
direction_list = ['U','D','L','R']
move_val = [(-1,0),(1,0),(0,-1),(0,1)]

# 시작 위치와 전차방향 구하는 함수
def get_start_location():
    for i in range(h):
        for j in range(w):
            for k in range(4):
                if graph[i][j] == car_direction_list[k]:
                    return (i, j, car_direction_list[k])

t = int(input())
for tc in range(t):
    h, w = map(int,input().split())
    graph = [list(input()) for _ in range(h)]
    move_times = int(input())
    go = list(input())

    # 시작하는 위치와 전차방향
    y, x, d = get_start_location()
    for move in go:
        # 포탄 발사하는 경우
        if move == 'S':
            # 이동해야하는 방향 구하기
            move_index = car_direction_list.index(d)
            move_y, move_x = move_val[move_index]
            ny, nx = y, x

            while 0 <= ny < h and 0 <= nx < w:
                # 벽돌인 경우
                if graph[ny][nx] == '*':
                    graph[ny][nx] = '.'
                    break

                # 강철인 경우
                if graph[ny][nx] == '#':
                    break
                ny += move_y
                nx += move_x

        # 움직이는 경우
        else:
            now_index = direction_list.index(move)
            r, c = move_val[now_index]
            d = car_direction_list[now_index]
            # 이동하기
            if 0 <= y + r < h and 0 <= x + c < w and graph[y + r][x + c] == '.':
                graph[y][x] = '.'
                y += r
                x += c
            graph[y][x] = d

    print(f'#{tc + 1}', end=' ')
    for i in graph:
        print(*i,sep='')