본문 바로가기

코딩테스트/SWEA

[Python, 파이썬] SWEA 1873. 상호의 배틀필드

 

게임 맵, 그리고 사용자 입력이 주어질 때 주어진 입력을 마친 후 게임 맵의 상태를 구하는 문제.

 

 

[게임 맵의 구성요소]

 

[사용자가 넣을 수 있는 입력의 종류]

 

[코드]


# 방향 이동 시 전차의 모양과 좌표
directions = {
    'U': (-1, 0, '^'),  # 위쪽 이동, 전차 모양 '^'
    'D': (1, 0, 'v'),   # 아래쪽 이동, 전차 모양 'v'
    'L': (0, -1, '<'),  # 왼쪽 이동, 전차 모양 '<'
    'R': (0, 1, '>')    # 오른쪽 이동, 전차 모양 '>'
}

# 포탄 발사 시 범위
move_d = {
    '^': (-1, 0), # 위쪽 이동
    'v': (1, 0),   # 아래쪽 이동
    '<': (0, -1),  # 왼쪽 이동
    '>': (0, 1)   # 오른쪽 이동
}

def find(game_map): # 현재 전차의 위치를 찾는 함수

    for i in range(H):
        for j in range(W):
            #print(game_map, game_map[i][j])
            if(game_map[i][j] in ['^', 'v', '<', '>']): # 전차이면
                return (i, j)

# 명령어에 따른 전차 조작
def game(command):
    if command in directions:
        move(command)
    elif command == 'S':
        Shoot()

# 전차 이동 
def move(direction):
    global x, y
    dx, dy, tank_shape = directions[direction]

    # 새 좌표 계산
    new_x, new_y = x + dx, y + dy

    # 새 좌표가 범위 안이고, 평지이면 이동
    if 0 <= new_x < H and 0 <= new_y < W and game_map[new_x][new_y] == '.':
        game_map[new_x][new_y] = tank_shape  # 새로운 위치에 전차 배치
        game_map[x][y] = '.'  # 현재 위치는 평지로 설정

        x, y = new_x, new_y   # 좌표 업데이트

    else: # 좌표 이동 없이 바라보는 방향만 바꾼다
        game_map[x][y] = tank_shape  # 방향 바꿈

# 전차 발사
def Shoot():

    direction = game_map[x][y] # 현재 전차 방향 
    crash(move_d[direction]) # 방향대로 포탄 발사

# 벽 파괴
def crash(direction):

    dx, dy = direction
    new_x, new_y = x, y # 임시 저장

    while (0 <= new_x < H and 0 <= new_y < W): # 맵 안 일 때

        if(game_map[new_x][new_y] == '#'): # 강철일 시
            return # 종료
        
        if(game_map[new_x][new_y] == '*'): # 벽돌이면
            game_map[new_x][new_y] = '.' # 평지 저장
            return

        # 바라보는 방향대로 이동
        new_x += dx
        new_y += dy

def print_map():

    for i in range(H):
        print(''.join(game_map[i])) 

T = int(input()) # 테스트케이스의 개수 T

for test_case in range(1, T+1):
    H, W = map(int, input().split()) # 게임 맵의 높이 H, 너비 W

    game_map = []

    # 초기 맵 입력받기
    for i in range(H):
        game_map.append(list(input()))    

    # 사용자 입력받기
    N = int(input())
    command_list = input()

    # 게임 시작
    x, y = find(game_map) # 전차의 위치를 찾는다
    for command in command_list:
        game(command)

    # 게임 맵 출력
    print("#%d" %(test_case), end=' ')
    print_map()
        
 

 

 

 

[문제풀이]


 

사용자의 입력에 따라 게임을 실행시키기만 하면 되는 문제.

 

if(game_map[new_x][new_y] == '*'): # 벽돌이면
      game_map[new_x][new_y] = '.' # 평지 저장
      return
 

 

Shoot일때는 지정한 dx, dy를 더하면서 벽돌일때 파괴시키고, 강철 혹은 맵 끝일 시 이동을 멈춘다.

 

# 새 좌표가 범위 안이고, 평지이면 이동
if 0 <= new_x < H and 0 <= new_y < W and game_map[new_x][new_y] == '.':
    game_map[new_x][new_y] = tank_shape  # 새로운 위치에 전차 배치
    game_map[x][y] = '.'  # 현재 위치는 평지로 설정

    x, y = new_x, new_y   # 좌표 업데이트

else: # 좌표 이동 없이 바라보는 방향만 바꾼다
    game_map[x][y] = tank_shape  # 방향 바꿈
 
 

 

또 좌표가 범위 안일 시 새로운 위치에 전차를 배치하고 좌표를 업데이트하고,

이동이 없을 시만 좌표 바라보는 방향만 바꾸게 재설정한다.

 

코드야 길지만 새로운 생각이 필요하다 하기보단 그저 규칙에 따라 구현만 하면 되는 간단한 문제였다.