[문제 링크] 👇
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
Solution
# 방향에 따른 전차 모양 및 이동 (북, 남, 서, 동)
tank_direction = {'^': 0, 'v': 1, '<': 2, '>': 3}
direction_symbols = ['^', 'v', '<', '>']
dx = [-1, 1, 0, 0] # 상, 하, 좌, 우 이동 (북, 남, 서, 동)
dy = [0, 0, -1, 1]
# 명령어 수행
def execute_commands(H, W, game_map, commands):
# 전차 위치 찾기
for i in range(H):
for j in range(W):
if game_map[i][j] in tank_direction:
x, y = i, j
direction = tank_direction[game_map[i][j]]
game_map[i][j] = '.'
# 명령어 수행
for command in commands:
if command == 'S': # 포탄 발사
nx, ny = x, y
while True:
nx += dx[direction]
ny += dy[direction]
if nx < 0 or nx >= H or ny < 0 or ny >= W:
break
if game_map[nx][ny] == '#':
break
if game_map[nx][ny] == '*':
game_map[nx][ny] = '.'
break
else: # 이동 명령
direction = {'U': 0, 'D': 1, 'L': 2, 'R': 3}[command]
game_map[x][y] = direction_symbols[direction]
nx, ny = x + dx[direction], y + dy[direction]
if 0 <= nx < H and 0 <= ny < W and game_map[nx][ny] == '.':
x, y = nx, ny
# 전차 위치 표시
game_map[x][y] = direction_symbols[direction]
return game_map
# 메인 함수
T = int(input())
for test_case in range(1, T + 1):
H, W = map(int, input().split())
game_map = [list(input().strip()) for _ in range(H)]
N = int(input())
commands = input().strip()
# 명령어 처리 후 결과 출력
result_map = execute_commands(H, W, game_map, commands)
print(f"#{test_case}")
for row in result_map:
print("".join(row))
내 풀이
def up(board, x, y):
# 범위를 벗어나거나, 벽이거나, 물일 때 이동 금지
if x - 1 >= 0 and board[x-1][y] != '#' and board[x-1][y] != '*' and board[x-1][y] != '-':
board[x][y] = '.'
board[x - 1][y] = '^'
return board, x - 1, y
board[x][y] = '^'
return board, x, y
def down(board, x, y):
if x + 1 < H and board[x+1][y] != '#' and board[x+1][y] != '*' and board[x+1][y] != '-':
board[x][y] = '.'
board[x + 1][y] = 'v'
return board, x + 1, y
board[x][y] = 'v'
return board, x, y
def left(board, x, y):
if y - 1 >= 0 and board[x][y - 1] != '#' and board[x][y - 1] != '*' and board[x][y - 1] != '-':
board[x][y] = '.'
board[x][y - 1] = '<'
return board, x, y - 1
board[x][y] = '<'
return board, x, y
def right(board, x, y):
if y + 1 < W and board[x][y + 1] != '#' and board[x][y + 1] != '*' and board[x][y + 1] != '-':
board[x][y] = '.'
board[x][y + 1] = '>'
return board, x, y + 1
board[x][y] = '>'
return board, x, y
def shoot(board, x, y):
if board[x][y] == '>':
for i in range(y + 1, W):
if board[x][i] == '*':
board[x][i] = '.'
return board, x, y
elif board[x][i] == '#':
return board, x, y
elif board[x][y] == '<':
for i in range(y - 1, -1, -1):
if board[x][i] == '*':
board[x][i] = '.'
return board, x, y
elif board[x][i] == '#':
return board, x, y
elif board[x][y] == '^':
for i in range(x - 1, -1, -1):
if board[i][y] == '*':
board[i][y] = '.'
return board, x, y
elif board[i][y] == '#':
return board, x, y
elif board[x][y] == 'v':
for i in range(x + 1, H):
if board[i][y] == '*':
board[i][y] = '.'
return board, x, y
elif board[i][y] == '#':
return board, x, y
return board, x, y
T = int(input()) # 테스트 케이스 수
for test_case in range(1, T + 1):
H, W = map(int, input().split())
board = [list(input().strip()) for _ in range(H)]
N = int(input())
command = input().strip()
x, y = 0, 0
for i in range(H):
for j in range(W):
if board[i][j] == '^' or board[i][j] == 'v' or board[i][j] == '<' or board[i][j] == '>':
x, y = i, j # 전차 현재 위치 저장
break
for i in command:
if i == 'U':
board, x, y = up(board, x, y)
elif i == 'D':
board, x, y = down(board, x, y)
elif i == 'L':
board, x, y = left(board, x, y)
elif i == 'R':
board, x, y = right(board, x, y)
elif i == 'S':
board, x, y = shoot(board, x, y)
print(f"#{test_case}", end=' ')
for i in board:
print(''.join(i))
👩💻 회고
D3에 있을만한 난이도는 맞는데 코테 연습용으로 풀기에는 좋은 문제는 아닌 것 같다.. 시간 낭비하는 느낌
'SWEA' 카테고리의 다른 글
[SWEA] 4047. 영준이의 카드 카운팅 (Python/D3) (2) | 2024.11.14 |
---|---|
[SWEA] 3260. 두 수의 덧셈 (Python/D3) (1) | 2024.11.14 |
[SWEA] 10580. 전봇대 (Python/D3) (1) | 2024.11.13 |
[SWEA] 6485. 삼성시의 버스 노선 (Python/D3) (2) | 2024.11.13 |
[SWEA] 5789. 현주의 상자 바꾸기 (Python/D3) (1) | 2024.11.13 |