[백준] 14503(python) - 로봇청소기 feat. Github Copilot Labs

Juheon Oh·2023년 3월 29일
0

로봇청소기 문제 링크

포스팅하는 이유는 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를 적극활용해야 한다

0개의 댓글