반응형
SOLUTION
import sys
from collections import deque
def check(x, y):
cnt = 0
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < H and 0 <= ny < W and maps[nx][ny] == '#':
start = directions[i]
cnt += 1
if cnt > 1:
return False
return start
def bfs(i, j):
path = deque([])
queue = deque([[i,j]])
visited[i][j] = True
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
direction = directions[i]
if 0 <= nx < H and 0 <= ny < W:
if maps[nx][ny] == '#' and visited[nx][ny] == False:
visited[nx][ny] = True
path.append(direction)
queue.append([nx,ny])
return path
H, W = map(int, sys.stdin.readline().split())
maps = [list(sys.stdin.readline().rstrip()) for _ in range(H)]
visited = [[False] * W for _ in range(H)]
dx = [-1,0,1,0]
dy = [0,1,0,-1]
directions = ['^','>','v','<']
ans = []
for row in range(H):
for col in range(W):
if maps[row][col] == '#' and check(row, col):
path = bfs(row, col)
print(row+1, col+1)
print(path[0])
current = path.popleft()
cnt = 1
for next in path:
if current == next:
cnt += 1
current = next
if cnt % 2 == 0:
ans.append("A")
cnt = 0
else:
# index가 감소 됐을 때 일치한다 -> 왼쪽으로 회전
if directions[directions.index(current) - 1] == next:
ans.append("L")
else:
# index가 증가 됐을 때 일치한다 -> 오른쪽으로 회전
ans.append("R")
current = next
cnt = 1
for i in ans:
print(i, end="")
sys.exit()
"명령어의 개수를 최소화하면서 목표를 달성할 수 있는 방법이 여러 가지라면, 그 중 한 가지를 아무거나 출력하면 된다."
라는 조건이 있으므로 만족하는 경로를 찾으면 sys.exit()을 이용해 바로 프로그램을 종료시킨다.
이 문제는 처음의 시작점이 어딘지 찾고, 시작 방향을 파악하는 것이 가장 중요하다. check() 함수를 이용해 시작지점과, 방향을 결정짓고, arr 배열에 지금까지 이동한 방향들을 넣는다.
그 후, 조건문을 통해 어떻게 움직였는지에 대한 명령어들을 ans에 담아 조건에 맞게 출력한다.
'코딩테스트 대비 > Softeer' 카테고리의 다른 글
[Softeer/Python] 복잡한 조립라인1 ★★★★☆ - 효과는 굉장했다! (0) | 2022.08.03 |
---|---|
[Softeer/Python] 징검다리2 ★★★★☆ - 효과는 굉장했다! (0) | 2022.07.24 |
[Softeer/Python] 수퍼바이러스 ★★★☆☆ - 효과는 굉장했다! (0) | 2021.11.26 |
[Softeer/Python] GINI야 도와줘 ★★★☆☆ - 효과는 굉장했다! (0) | 2021.11.25 |
[Softeer/Python] 징검다리 ★★★☆☆ - 효과는 굉장했다! (0) | 2021.11.23 |