https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc
1. 해결방법
로직 자체는 어렵지 않으나 조건이 많고 코드가 길어져서 시간을 꽤 소모했다. 1시간 30분정도 걸렸다,,,, (디버깅 40분)
1. 맵에서 탱크의 위치와 방향을 저장한다. (y, x, direct)
2. 커맨드를 For문 돌려서 대포 발사와 탱크 방향 이동 커맨드를 분리시켜 조건문을 단다.
3. S인 경우 각 방향에 맞는 다음 좌표를 확인하고, 벽돌과 강철일 경우 조건에 맞게 처리하고 break한다. (벽에 한번 부딪히면 멈춰야 함.)
4. UDLR이면 각 방향에 대해 범위에 벗어나지 않도록 조건문을 달고 평지일 경우 탱크의 위치를 이동한다.
5. 탱크의 위치가 이동하든 안하든 방향은 무조건 바뀌어야 한다.
2. 정답코드
T = int(input())
# T = 10
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
H, W = map(int, input().split())
maps = [list(map(str, input().strip())) for _ in range(H)]
N = int(input())
strings = list(map(str, input().strip()))
tank = []
for i in range(H):
for j in range(W):
if maps[i][j] == '<' or maps[i][j] == '>' or maps[i][j] == '^' or maps[i][j] == 'v':
tank.append((i, j, maps[i][j]))
break
else: continue
y, x, direct = tank[0][0], tank[0][1], tank[0][2]
for s in strings:
# 대포 발사 문자열 (S)
if s == 'S':
# 탱크 방향이 왼쪽
if direct == '<':
for k in range(x - 1, -1, -1): # 왼쪽 탐색
if maps[y][k] == '*': # 벽돌 일때,
maps[y][k] = '.'
break
elif maps[y][k] == '#': # 강철 일때,
break
# 탱크 방향이 오른쪽
elif direct == '>':
for k in range(x + 1, W):
if maps[y][k] == '*': # 벽돌 일때,
maps[y][k] = '.'
break
elif maps[y][k] == '#':
break
# 탱크 방향이 위쪽
elif direct == '^':
for k in range(y - 1, -1, -1):
if maps[k][x] == '*':
maps[k][x] = '.'
break
elif maps[k][x] == '#':
break
# 탱크 방향이 아래쪽
elif direct == 'v':
for k in range(y + 1, H):
if maps[k][x] == '*':
maps[k][x] = '.'
break
elif maps[k][x] == '#':
break
# 이동 문자열 (U, D, L, R)
# 위쪽 이동
elif s == 'U':
direct = '^'
# 평지 일때
if 0 <= y - 1 < H:
if maps[y - 1][x] == '.':
maps[y][x] = '.'
y -= 1
maps[y][x] = direct
# 아래쪽 이동
elif s == 'D':
direct = 'v'
# 평지 일때
if 0 <= y + 1 < H:
if maps[y + 1][x] == '.':
maps[y][x] = '.'
y += 1
maps[y][x] = direct
# 왼쪽 이동
elif s == 'L':
direct = '<'
# 평지 일때
if 0 <= x - 1 < W:
if maps[y][x - 1] == '.':
maps[y][x] = '.'
x -= 1
maps[y][x] = direct
# 오른쪽 이동
elif s == 'R':
direct = '>'
# 평지 일때
if 0 <= x + 1 < W:
if maps[y][x + 1] == '.':
maps[y][x] = '.'
x += 1
maps[y][x] = direct
for i in range(H):
if i == 0:
print(f'#{test_case} ' + ''.join(map(str, maps[i])))
else:
print(''.join(map(str, maps[i])))
'Algorithm > SWEA' 카테고리의 다른 글
[SWEA] D3. 최장 증가 부분 수열 (0) | 2022.11.17 |
---|---|
[SWEA] D3. 재미있는 오셀로 게임 (0) | 2022.11.14 |
[SWEA] D3. 회문2 (0) | 2022.11.11 |
[SWEA] D3. N-Queen (0) | 2022.11.11 |
[SWEA] D3. Magnetic (0) | 2022.11.11 |