코딩 테스트
[Python] SWEA 1873. 상호의 배틀필드
위시리
2025. 1. 23. 22:04
1차 - 실패..
import sys
input = sys.stdin.readline
from collections import deque
tc = int(input())
for t in range(1, tc+1) :
h, w = map(int, input().split())
ground = [list(input().strip()) for _ in range(h)]
current = deque()
n = int(input())
user_input = input().strip()
# 전차의 현재 위치 찾기
for i in range(h):
for j in range(w) :
if ground[i][j] == '^' or ground[i][j] == 'v' or ground[i][j] == '<' or ground[i][j] == '>' :
current.append((ground[i][j], i, j)) # 현재 위치와 모양
break
for move in user_input :
if len(current) == 0 :
print('안에 암것도 없음')
exit(0)
cur, r, c = current.popleft()
ground[r][c] = '.'
if move == 'U' : # up
change_cur = "^"
nr = r-1
nc = c
if nr <= 0 or nr >h or nc <= 0 or nc >w : # 범위를 넘어서면 제자리
current.append((change_cur, r, c))
ground[r][c] = '^'
elif ground[nr][nc] != '.' : # 그 다음 이동하려는 위치가 평지가 아니면
current.append((change_cur, r, c))
ground[r][c] = '^'
else : # 이동할 수 있다면
print('nr : ', nr, 'nc ; ', nc)
current.append((change_cur, nr-1, nc))
ground[r-1][nc] = '^'
elif move == 'D' : # down
change_cur = "v"
nr = r+1
nc = c
if nr <= 0 or nr > h or nc <= 0 or nc > c: # 범위를 넘어서면 제자리
current.append((change_cur, r, c))
ground[r][c] = 'v'
elif ground[nr][nc] != '.': # 그 다음 이동하려는 위치가 평지가 아니면
current.append((change_cur, r, c))
ground[r][c] = 'v'
else :
current.append((change_cur, nr+1, nc))
ground[r + 1][nc] = 'v'
ground[r][c] = '.'
elif move == 'L' : # left
change_cur = "<"
nr = r
nc = c-1
if nr <= 0 or nr > h or nc <= 0 or nc > c: # 범위를 넘어서면 제자리
current.append((change_cur, r, c))
ground[r][c] = '<'
elif ground[nr][nc] != '.': # 그 다음 이동하려는 위치가 평지가 아니면
current.append((change_cur, r, c))
ground[r][c] = '<'
else :
current.append((change_cur, nr, nc-1))
ground[r][c-1] = '<'
ground[r][c] = '.'
elif move == 'R' : # right
change_cur = ">"
nr = r
nc = c+1
if nr <= 0 or nr > h or nc <= 0 or nc > c: # 범위를 넘어서면 제자리
current.append((change_cur, nr, nc))
ground[r][c] = '>'
elif ground[nr][nc] != '.': # 그 다음 이동하려는 위치가 평지가 아니면
current.append((change_cur, nr, c))
ground[r][c]= '>'
else :
current.append((change_cur, nr, nc+1))
ground[nr][nc+1] = '>'
ground[r][c] = '.'
else : # shoot
current.append([cur, r, c])
if cur == '^' :
while(r >= 0) :
r -= 1
if ground[r][c] == '#':
break
if ground[r][c] == '*' :
ground[r][c] = '.'
elif cur == 'v' :
while(r < h-1) :
r += 1
if ground[r][c] == '#':
break
if ground[r][c] == '*':
ground[r][c] = '.'
elif cur == '<' : # left
while (c >= 0):
c -= 1
if ground[r][c] == '#':
break
if ground[r][c] == '*':
ground[r][c] = '.'
else :
while (c<w-1) :
c+=1
if ground[r][c] == '#':
break
if ground[r][c] == '*':
ground[r][c] = '.'
print('move : ', move)
print('current : ', cur)
print('ground : ', ground)
print(f'#{tc}', end=' ')
for i in range(h) :
print(''.join(map(str,ground[i])))
전차가 움직이고 나서 지워지지 않음
2차
- 현재 전차의 위치 찾기
- 명령어 순서대로 실행
- 전차가 움직여야 하는 경우 현재 위치에서 전차가 움직일 수 있는지 확인
- 현재 위치는 잔디로 바꾸고
- 움직일 수 있다면 전차의 방향과 위치 바꾸기
- 전차가 움직일 수 있는 경우는 : 평지 & 맵 안
- 전차가 포탄을 쏠 경우
- 충돌 : 벽에 부딪히면 소멸
- 벽돌에 부딪히면 파괴되어 평지
- 강철에 부딪히면 아무일도 일어나지 x
- 평지나 물을 지나 게임 맵 밖으로 나감
- 충돌 : 벽에 부딪히면 소멸
tc = int(input())
for t in range(1, tc+1) :
row, col = map(int, input().split())
g = [list(input().strip()) for _ in range(row)]
n = int(input())
com = input()
def isRange(h, w):
if h < 0 or h >= row or w < 0 or w >= col :
return False
return True
def shoot(h, w, dh, dw) :
nh = h + dh
nw = w + dw
while isRange(nh, nw) :
# 벽돌 벽에 충돌하면 평지로 바뀌고 소멸
if g[nh][nw] == '*' :
g[nh][nw] = '.'
break
# 강철 벽에 부딪히면 그냥 소멸
elif g[nh][nw] == '#' :
break
nh += dh
nw += dw
# 1. 현재 전차의 위치 찾기
current = None
for i in range(row) :
for j in range(col) :
if g[i][j] == '^' or g[i][j] == 'v' or g[i][j] == '<' or g[i][j] == '>' :
# if g[i][j] in '^v<>':
current = (i,j)
break
if current :
break
# 2. 현재 명령어 확인 - 명령어 수 만큼 반복
for c in com :
h,w = current
# 2-1. 만약 전차를 이동해야 한다면 -> 1) 전차가 다음 위치로 이동할 수 있는지 2) 명령어에 대한 방향 적용
if c == 'U' : # up
g[h][w] = '.'
nh = h-1
if isRange(nh, w) and g[nh][w] == '.': # 다음 위치로 이동할 수 있다면
g[nh][w] = '^'
# current.append((nh,w))
h = nh
else : # 이동할 수 없다면
g[h][w] = '^'
# current.append((h,w))
current = (h,w)
elif c == 'D' :
g[h][w] = '.'
nh = h + 1
if isRange(nh, w) and g[nh][w] == '.': # 다음 위치로 이동할 수 있다면
g[nh][w] = 'v'
# current.append((nh, w))
h = nh
else: # 이동할 수 없다면
g[h][w] = 'v'
# current.append((h, w))
current = (h, w)
elif c == 'L' :
g[h][w] = '.'
nw = w - 1
if isRange(h, nw) and g[h][nw] == '.': # 다음 위치로 이동할 수 있다면
g[h][nw] = '<'
# current.append((h, nw))
w = nw
else: # 이동할 수 없다면
g[h][w] = '<'
# current.append((h, w))
current = (h, w)
elif c == 'R':
g[h][w] = '.'
nw = w + 1
if isRange(h, nw) and g[h][nw] == '.': # 다음 위치로 이동할 수 있다면
g[h][nw] = '>'
# current.append((h, nw))
w = nw
else: # 이동할 수 없다면
g[h][w] = '>'
# current.append((h, w))
current = (h, w)
else : # shoot
# 현재 위치 h, w
if g[h][w] == '^' :
shoot(h,w,-1,0)
elif g[h][w] == 'v' :
shoot(h,w,+1,0)
elif g[h][w] == '<' :
shoot(h,w,0,-1)
else :
shoot(h, w, 0, 1)
# current.append((h,w))
current = (h, w)
print(f'#{t}', end=' ')
for line in g:
print(''.join(line))
gpt
import sys
sys.stdin = open("input.txt", "r")
def isRange(h, w, row, col):
return 0 <= h < row and 0 <= w < col
def shoot(g, h, w, dh, dw, row, col):
nh, nw = h + dh, w + dw
while isRange(nh, nw, row, col):
if g[nh][nw] == '*': # 벽돌 벽
g[nh][nw] = '.'
break
elif g[nh][nw] == '#': # 강철 벽
break
nh += dh
nw += dw
tc = int(input())
for t in range(1, tc+1):
row, col = map(int, input().split())
g = [list(input().strip()) for _ in range(row)]
n = int(input())
commands = input().strip()
# 전차 위치 및 방향 찾기
tank_pos = None
for i in range(row):
for j in range(col):
if g[i][j] in '^v<>':
tank_pos = (i, j)
break
if tank_pos:
break
h, w = tank_pos
direction_map = {
'U': (-1, 0, '^'),
'D': (1, 0, 'v'),
'L': (0, -1, '<'),
'R': (0, 1, '>'),
}
# 명령 처리
for c in commands:
if c in 'UDLR': # 이동 명령
dh, dw, new_dir = direction_map[c]
g[h][w] = new_dir
nh, nw = h + dh, w + dw
if isRange(nh, nw, row, col) and g[nh][nw] == '.':
g[nh][nw] = new_dir
g[h][w] = '.'
h, w = nh, nw
elif c == 'S': # 포탄 발사
if g[h][w] == '^':
shoot(g, h, w, -1, 0, row, col)
elif g[h][w] == 'v':
shoot(g, h, w, 1, 0, row, col)
elif g[h][w] == '<':
shoot(g, h, w, 0, -1, row, col)
elif g[h][w] == '>':
shoot(g, h, w, 0, 1, row, col)
# 결과 출력
print(f'#{t}')
for line in g:
print(''.join(line))