난이도 : D3
문제번호 : 1873
※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
상호는 전차로 시가전을 하는 것을 테마로 한 새로운 게임 “배틀 필드”를 개발하기로 했다.
|
입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다. |
출력
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 칸을 띄운 후, 모든 입력을 처리하고 난 후의 게임 맵을 H개의 줄에 걸쳐 출력한다. |
예시
입력 | 출력 |
1 3 7 ***.... *-..#** #<.**** 23 SURSSSSUSLSRSSSURRDSRDS |
#1 **....v .-..#.. #...... |
2. 문제풀이
딱히 큰어려움이 없는 문제였다. 단지 코드가 길어서 그렇지... 명령을 반복문을 통해 가져오는데 명령에 따라 다른 상황을 하도록 만들었다 기본적으로 본것은 이동과 슛팅이다. 슛팅일 경우와 이동일 경우로 분리했다.
이동일 경우 먼저 방향을 바꾼뒤에 이동을 했다. 이동을 못하더라도 방향은 그쪽을 봐야하기 때문이다. 슛일 경우 보는 방향을 기점으로 범위를 나가거나 철벽 혹은 돌벽인지 판단하고 돌벽일경우 평지로 바꿔주면 끝이었다. |
3. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#D3 1873 상호의 배틀필드
move_list = [(-1, 0), (1, 0), (0, -1), (0, 1)]
command_dict = {'U' : 0, 'D' : 1, 'L' : 2, 'R' : 3, 'S' :4,
'^' : 0, 'v' : 1, '<': 2, '>': 3, 0: '^', 1: 'v', 2:'<', 3:'>'}
serch_list = ['<', '>', '^', 'v']
for t in range(1, int(input()) + 1):
H, W = map(int, input().split())
map_list = [list(input()) for _ in range(H)]
#탱크의 위치를 찾는다.
for i in range(H):
for j in range(W):
if map_list[i][j] in serch_list:
tank_pos = (i, j, command_dict[map_list[i][j]])
break
#브레이크에 안걸렸다면 진행한다.
else: continue
#브레이크가 걸렸다면 모든 반복문을 나온다.
break
#N값은 안쓰니까 버린다.
input()
#명령어 저장
commands = input()
#명령어를 순회하면서 처리
for command in commands:
temp = command_dict[command]
#포탄 발싸라면
if temp == 4:
#탱크 위치에서 탱크가 바라보는 방향의 위치를 얻는다.
dy = tank_pos[0]
dx = tank_pos[1]
#포탄은 계속 전진한다.
while True:
dy += move_list[tank_pos[2]][0]
dx +=move_list[tank_pos[2]][1]
#포탄이 밖으로 벋어나거나 강철벽을 만나면 아무처리도 안한다.
if 0 > dy or dy >= H or 0 > dx or dx >= W or map_list[dy][dx] == '#':
break
#돌벽을 만나게 된다면
if map_list[dy][dx] == '*':
#평지로 바꿔준다.
map_list[dy][dx] = '.'
break
#이동 명령이라면
else:
y = tank_pos[0]
x = tank_pos[1]
dy = y + move_list[temp][0]
dx = x + move_list[temp][1]
map_list[y][x] = command_dict[temp]
tank_pos = (y, x, temp)
#맵 범위 안에있고 평지여야함.
if 0 <= dy < H and 0 <= dx < W and map_list[dy][dx] == '.':
#기존위치를 평지로 바꾸고
map_list[y][x] = '.'
#가야하는 위치에 탱크 표시
map_list[dy][dx] = command_dict[temp]
#탱크위치 갱신
tank_pos = (dy, dx, temp)
print('#{}'.format(t), end=' ')
for m in map_list:
print(''.join(m))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
최장경로 Python(SW Expert Academy) (0) | 2020.03.23 |
---|---|
농작물 수확하기 Python(SW Expert Academy) (0) | 2020.03.22 |
수의 새로운 연산 Python(SW Expert Academy) (0) | 2020.03.20 |
암호생성기 Python(SW Expert Academy) (0) | 2020.03.19 |
GNS Python(SW Expert Academy) (0) | 2020.03.18 |
댓글