포스팅하는 이유는 Github Copilot 리팩토링 기능이 좋아서..
import sys
from collections import deque
n, m = map(int, sys.stdin.readline().split())
init_row, init_col, direction = map(int, sys.stdin.readline().split())
# 0:북, 1:동, 2:남, 3:서
room_board = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
compass = {0: (-1, 0), 3: (0, -1), 2: (1, 0), 1: (0, 1)}
order_compass = {0: [3, 2, 1, 0], 1: [0, 3, 2, 1], 2: [1, 0, 3, 2], 3: [2, 1, 0, 3]}
def bfs():
q = deque()
q.append((init_row, init_col, direction))
cnt = 0
while q:
flag = False
x, y, d = q.popleft()
if room_board[x][y] == 0:
room_board[x][y] = 2
cnt += 1
for i in order_compass[d]:
nx = compass[i][0] + x
ny = compass[i][1] + y
if 0 <= nx < n and 0 <= ny < m and room_board[nx][ny] == 0:
q.append((nx, ny, i))
flag = True
break
if not flag:
back_d = (d + 2) % 4
back_x = compass[back_d][0] + x
back_y = compass[back_d][1] + y
if (0 <= back_x < n and 0 <= back_y < m and room_board[back_x][back_y] != 1):
q.append((back_x, back_y, d))
elif (0 <= back_x < n and 0 <= back_y < m and room_board[back_x][back_y] == 1):
flag = True
break
flag = False
if flag:
break
return cnt
print(bfs())
직접 구현해서 풀었고 생각보다 코드가 맘에 안들었다.
(정확히 말하면 flag말고는 방법이 없나?)
Github Copliot Labs에 있는 Brushes의 CLEAN
기능을 이용해봤다.
(원하는 부분을 드래그하고 CLEAN
을 눌러주면 알아서 바꿔줌)
import sys
from collections import deque
n, m = map(int, sys.stdin.readline().split())
init_row, init_col, direction = map(int, sys.stdin.readline().split())
room_board = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
compass = {0: (-1, 0), 3: (0, -1), 2: (1, 0), 1: (0, 1)}
order_compass = {0: [3, 2, 1, 0], 1: [0, 3, 2, 1], 2: [1, 0, 3, 2], 3: [2, 1, 0, 3]}
def bfs():
q = deque()
q.append((init_row, init_col, direction))
cnt = 0
while q:
x, y, d = q.popleft()
if room_board[x][y] == 0:
room_board[x][y] = 2
cnt += 1
for i in order_compass[d]:
nx = compass[i][0] + x
ny = compass[i][1] + y
if 0 <= nx < n and 0 <= ny < m and room_board[nx][ny] == 0:
q.append((nx, ny, i))
break
else:
back_d = (d + 2) % 4
back_x = compass[back_d][0] + x
back_y = compass[back_d][1] + y
if (0 <= back_x < n and 0 <= back_y < m and room_board[back_x][back_y] != 1):
q.append((back_x, back_y, d))
elif (0 <= back_x < n and 0 <= back_y < m and room_board[back_x][back_y] == 1):
break
return cnt
print(bfs())
Copilot
이 flag를 사용한 부분을 없애주고 for-else
문으로 리팩토링 해주셨다..
훨씬 가독성 좋고 깔끔하게 떨어져서 Copilot
만족도가 높다..
for-else
문 되게 생소한데 잘 써먹으면 유용하네..
나보다 코딩 잘하는 AI를 적극활용해야 한다