코딩테스트/SWEA
[Python, 파이썬] SWEA 1873. 상호의 배틀필드
알코딩
2024. 10. 20. 01:11
게임 맵, 그리고 사용자 입력이 주어질 때 주어진 입력을 마친 후 게임 맵의 상태를 구하는 문제.
[게임 맵의 구성요소]

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

[코드]
# 방향 이동 시 전차의 모양과 좌표
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 # 방향 바꿈
또 좌표가 범위 안일 시 새로운 위치에 전차를 배치하고 좌표를 업데이트하고,
이동이 없을 시만 좌표 바라보는 방향만 바꾸게 재설정한다.
코드야 길지만 새로운 생각이 필요하다 하기보단 그저 규칙에 따라 구현만 하면 되는 간단한 문제였다.