문제풀이/SWEA
[SWEA] #1873 상호의 배틀필드.python(파이썬)
jer0618
2021. 8. 21. 01:50
마치 게임을 개발하는 듯한 기분이 들어서 재밌었다.
문제 링크 / 출처
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제 요약
주어진 맵에서 입력받은 명령을 수행했을 때, 변경된 맵을 출력하는 문제
[제약사항]
두 정수 H, W (2 ≤ H, W ≤ 20)
- 정수 N(0 < N ≤ 100)
풀이
- index를 사용해 다른 리스트에 접근할 수 있도록 방향과 관련된 요소들을 세개의 리스트를 생성했다.
- 문자열은 변경이 불가능하므로,
field
를 입력 받을 때 문자열이 낱개로 분리된 리스트로 입력받아 변경을 용이하게 만들었다.findme
함수를 사용해 현재의 위치와 보고있는 방향을 받아왔다. - 포탄의 좌표를 따로 생성하고 보고있는 방향의 인덱스를 활용해 1에서 좌표이동에 관한 정보(
drc_list
)를 가져왔다. 해당 방향으로 진행하며, 포탄이 범위밖으로 벗어날 때까지 while문을 돌렸다.- 중간에 벽을 만나는경우, 강철벽의 경우 바로 while문 탈출
- 벽돌벽의 경우 벽돌벽 삭제 후 탈출
- 3과 마찬가지로 1에서 인덱스를 활용해 이동정보를 가져왔다. 이동할 좌표가 범위내에 있는지 확인하고,
- 그곳이 평지(
'.'
)라면, 현재 위치를 평지로 바꾼후 좌표를 이동, 이동 후 좌표에 탱크의 모습을 표시한다. - 평지가 아니라면, 이동하지 않고 방향만 전환해준다.
- 그곳이 평지(
코드
def findme():
for r in range(H):
for c in range(W):
for i in range(4):
if field[r][c] == direction_list[i]:
return (r, c, direction_list[i])
# 1. 상하좌우
cmd_dir_list = ['U', 'D', 'L', 'R']
drc_list = [(-1, 0), (1, 0), (0, -1), (0, 1)]
direction_list = ['^', 'v', '<', '>']
# 2. input
T = int(input())
for tc in range(1, T+1):
H, W = map(int, input().split())
field = [list(input()) for _ in range(H)]
N = int(input())
cmd_list = input()
me_r, me_c, me = findme()
for cmd in cmd_list:
if cmd == 'S': # 3. 포탄 발사
bomb_idx = direction_list.index(me)
b_r, b_c = drc_list[bomb_idx]
bomb_r, bomb_c = me_r, me_c
while 0 <= bomb_r < H and 0 <= bomb_c < W:
if field[bomb_r][bomb_c] == '#':
break
if field[bomb_r][bomb_c] == '*':
field[bomb_r][bomb_c] = '.'
break
bomb_r += b_r
bomb_c += b_c
else: # 4. move
me_idx = cmd_dir_list.index(cmd)
r, c = drc_list[me_idx]
me = direction_list[me_idx]
if 0 <= me_r + r < H and 0 <= me_c + c < W and field[me_r + r][me_c + c] == '.':
field[me_r][me_c] = '.'
me_r += r
me_c += c
field[me_r][me_c] = me
print('#', tc, sep='', end=' ')
for f in field:
print(*f, sep='')
반응형