SWEA-1873-상호의 배틀필드

이동규·2020년 12월 29일
0

평범한 시뮬레이션 문제, 델타 좌표와 문자열로 입력받은 방향의 인덱스를 동일하게 설정함


dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
direction = ['^', 'v', '<', '>']
command_direction = ['U', 'D', 'L', 'R']

for T in range(1, int(input())+1):
    R, C = list(map(int, input().split()))
    M = []
    now_r, now_c = 0, 0

    for r in range(R):
        temp = list(input())
        M.append(temp)
        for c in range(C):
            if temp[c] in direction:
                d = direction.index(M[r][c]) # 탱크가 현재 바라보는 방향
                now_r, now_c = r, c # 탱크가 현재 위치하는 좌표

    COMMAND_NUM = int(input())
    COMMAND = list(input())

    for cmd in COMMAND:
        if cmd == 'S': # 입력된 커맨드가 탱크가 정면에 대포를 발사하는 커맨드라면
            dr, dc = now_r+dx[d], now_c+dy[d] # 탱크가 바라보는 방향에서 한 칸 앞의 좌표
            while 0 <= dr < R and 0 <= dc < C: # 해당 좌표가 지도 내에 존재하는 좌표라면
                if M[dr][dc] == '*': # 부수는게 가능한 벽이라면
                    M[dr][dc] = '.' # 부수고 땅으로 바꿔준다
                    break # 벽에 포탄이 부딪혔으므로 루프 탈출
                elif M[dr][dc] == '#': # 부스는게 불가능한 벽이라면
                    break # 벽에 포탄이 부딪혔으므로 루프 탈출
                # 벽을 만나지 않았다면 포탄을 정면으로 진행시킨다
                dr += dx[d]
                dc += dy[d]
        else: # 입력된 커맨드가 탱크의 위치와 관련된 커맨드라면
            to = command_direction.index(cmd)  # 가야할 방향을 확인
            M[now_r][now_c] = direction[to] # 탱크를 가야할 방향으로 돌린다
            dr, dc = now_r + dx[to], now_c + dy[to] # 가야할 방향에서 바로 1칸 앞 좌표
            if 0 <= dr < R and 0 <= dc < C and M[dr][dc] == '.': # 이 좌표가 평지이고 맵 안에 있다면
                M[dr][dc] = M[now_r][now_c] # 탱크를 이곳으로 옮기고
                M[now_r][now_c] = '.' # 기존에 탱크가 있던 자리는 땅으로 바꾼다
                now_r, now_c = dr, dc # 현재 좌표도 탱크가 있는 곳으로 재설정
            d = to # 현재 탱크의 방향 설정

    print('#{}'.format(T), end=' ')
    for r in M:
        print(''.join(r))

0개의 댓글