SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
📌 작성한 코드
T = int(input())
for tc in range(1,1+T):
h,w = map(int,input().split())
arr = [list(input()) for _ in range(h)]
n = int(input())
command = list(input())
x, y = 0, 0
direction = ''
for i in range(h):
for j in range(w):
if arr[i][j] == '^':
direction = 'U'
x,y = i,j
break
if arr[i][j] == 'v':
direction = 'D'
x,y = i,j
break
if arr[i][j] == '>':
direction = 'R'
x,y = i,j
break
if arr[i][j] == '<':
direction = 'L'
x,y = i,j
break
for c in command:
if c == 'U':
direction = 'U'
arr[x][y] = '^'
if x-1 >= 0 and arr[x-1][y] == '.':
arr[x-1][y] = '^'
arr[x][y] = '.'
x = x-1
if c == 'D':
direction = 'D'
arr[x][y] = 'v'
if x+1 < h and arr[x+1][y] == '.':
arr[x+1][y] = 'v'
arr[x][y] = '.'
x = x+1
if c == 'L':
direction = 'L'
arr[x][y] = '<'
if y-1 >= 0 and arr[x][y-1] == '.':
arr[x][y-1] = '<'
arr[x][y] = '.'
y = y-1
if c == 'R':
direction = 'R'
arr[x][y] = '>'
if y+1 < w and arr[x][y+1] == '.':
arr[x][y+1] = '>'
arr[x][y] = '.'
y = y+1
if c == 'S':
if direction == 'U':
for i in range(x,-1,-1):
if arr[i][y] == '*':
arr[i][y] = '.'
break
if arr[i][y] == '#':
break
if direction == 'D':
for i in range(x,h):
if arr[i][y] == '*':
arr[i][y] = '.'
break
if arr[i][y] == '#':
break
if direction == 'L':
for i in range(y,-1,-1):
if arr[x][i] == '*':
arr[x][i] = '.'
break
if arr[x][i] == '#':
break
if direction == 'R':
for i in range(y,w):
if arr[x][i] == '*':
arr[x][i] = '.'
break
if arr[x][i] == '#':
break
print(f'#{tc}', end=" ")
for i in arr:
print(''.join(i))
📌 풀이
- 너무 하드코딩으로 푼 거 같아서 완전히 맘에 들지는 않는 풀이..
1. 입력받고 현재 전차의 위치와 방향을 구해준다.
h,w = map(int,input().split())
arr = [list(input()) for _ in range(h)]
n = int(input())
command = list(input())
x, y = 0, 0
direction = ''
for i in range(h):
for j in range(w):
if arr[i][j] == '^':
direction = 'U'
x,y = i,j
break
if arr[i][j] == 'v':
direction = 'D'
x,y = i,j
break
if arr[i][j] == '>':
direction = 'R'
x,y = i,j
break
if arr[i][j] == '<':
direction = 'L'
x,y = i,j
break
2. 명령어에 따라 움직이는 행동을 정의해준다.
- udrl 일때는 해당 방향으로 방향으로 바꾸고, (direction이랑 전차 형태도 바꿔준다)
- 해당 방향의 바로 앞의 좌표가 범위를 벗어나지 않고, 평지이면 해당 자리로 이동한다.
if c == 'U':
direction = 'U'
arr[x][y] = '^'
if x-1 >= 0 and arr[x-1][y] == '.':
arr[x-1][y] = '^'
arr[x][y] = '.'
x = x-1
if c == 'D':
direction = 'D'
arr[x][y] = 'v'
if x+1 < h and arr[x+1][y] == '.':
arr[x+1][y] = 'v'
arr[x][y] = '.'
x = x+1
if c == 'L':
direction = 'L'
arr[x][y] = '<'
if y-1 >= 0 and arr[x][y-1] == '.':
arr[x][y-1] = '<'
arr[x][y] = '.'
y = y-1
if c == 'R':
direction = 'R'
arr[x][y] = '>'
if y+1 < w and arr[x][y+1] == '.':
arr[x][y+1] = '>'
arr[x][y] = '.'
y = y+1
3. 명령이 s인 경우에는 해당 방향에서 한칸씩 앞으로 가면서 벽이 있는지 확인한다.
- 벽이 *인 벽돌로 된 벽이면, 해당 벽을 부수고 포탄이 더이상 움직이지 않도록 break해준다.
- 벽이 #인 강철로 된 벽이면, 해당 벽은 그대로 두고 포탄만 없애준다.
-> u,d은 x 좌표을 증감시켜가며 찾고, rl는 y좌표를 증감시켜가며 찾는다.
if c == 'S':
if direction == 'U':
for i in range(x,-1,-1):
if arr[i][y] == '*':
arr[i][y] = '.'
break
if arr[i][y] == '#':
break
if direction == 'D':
for i in range(x,h):
if arr[i][y] == '*':
arr[i][y] = '.'
break
if arr[i][y] == '#':
break
if direction == 'L':
for i in range(y,-1,-1):
if arr[x][i] == '*':
arr[x][i] = '.'
break
if arr[x][i] == '#':
break
if direction == 'R':
for i in range(y,w):
if arr[x][i] == '*':
arr[x][i] = '.'
break
if arr[x][i] == '#':
break

'알고리즘 > SWEA' 카테고리의 다른 글
| [Python] SWEA D3 : 3131 - 100만 이하의 모든 소수 (0) | 2023.11.17 |
|---|---|
| [Python] SWEA D3 : 9280. 진용이네 주차타워 (1) | 2023.11.17 |
| [Python] SWEA D3 : 1225 - [S/W 문제해결 기본] 7일차 - 암호생성기 (0) | 2023.11.16 |
| [Python] SWEA D3 : 5789 - 현주의 상자 바꾸기 (0) | 2023.11.16 |
| [Python] SWEA D3 : 4047 - 영준이의 카드 카운팅 (0) | 2023.11.16 |