[Algorithm] 파이썬 델타 이용해 상하좌우 탐색하기

Serin Yoon·2021년 3월 8일
2

Algorithm

목록 보기
5/7
post-thumbnail

백준에서 BFS/DFS 문제를 풀다가 상하좌우를 탐색해야 하는 문제를 발견했다. (https://www.acmicpc.net/problem/7576)
나는 배열을 1차원 배열로 만들고, 왼쪽 노드의 index를 i-1, 오른쪽 노드의 index를 i+1, 위쪽 노드를 i-N, 아래쪽 노드를 i+N 이런 식으로 직접 접근하곤 했는데 이것보다 간단한 방법을 알게 되어 정리해보려고 한다.

델타를 이용한 상하좌우 노드 탐색

import sys

input = sys.stdin.readline

n = int(input())

paint = [list(map(int, input().split())) for _ in range(n)]

dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]

print(paint)

while True:
    print('행 index >>', end=' ')
    x = int(input())
    print('열 index >>', end=' ')
    y = int(input())
    for i in range(4):
        pointX = x + dx[i]
        pointY = y + dy[i]
        print(paint[pointX][pointY])

전체 코드는 이렇다.
sys는 시간을 조금이라도 줄이기 위해 항상 사용한다.
행의 개수(n)를 입력받고, 2번째 줄부터 n+1번째 줄까지 한 행에 있는 모든 노드를 입력받고, 배열 paint에 저장하였다.

예를 들어,

1 2 3
4 5 6
7 8 9

이런 식으로 2차원 배열이 생성되었다고 하자.
(ex. paint[0][1] = 2, paint[2][0] = 7, ...)

행 인덱스 x 값을 입력 받고, 열 인덱스 y 값을 입력받는다.
만약 x = 1, y = 1이면 기준이 되는 노드는 paint[1][1]인 5가 된다.

이제 델타를 이용하여 노드 5의 상하좌우 노드를 확인할 수 있다.

for i in range(4):
        pointX = x + dx[i]
        pointY = y + dy[i]
        print(paint[pointX][pointY])

for문만 집중적으로 살펴보자.

i = 0

pointX = x + 0 = x
pointY = y + (-1) = y - 1

행은 변화가 없고, 열이 하나 줄었으므로 왼쪽 노드의 좌표이다.

i = 1

pointX = x + 0 = x
pointY = y + 1

행은 변화가 없고, 열이 하나 늘었으므로 오른쪽 노드의 좌표이다.

i = 2

pointX = x + (-1) = x - 1
pointY = y + 0 = y
행은 하나 줄었고, 열은 변화가 없으므로 위쪽 노드의 좌표이다.

i = 3

pointX = x + 1
pointY = y + 0 = y
행은 하나 늘었고, 열은 변화가 없으므로 아래쪽 노드의 좌표이다.



주의할 점

예를 들어 기준 노드의 좌표가 (0, 0)이라고 하면
오른쪽 노드, 아래쪽 노드는 존재하지만 왼쪽 노드, 위쪽 노드는 존재하지 않는다.
이런 경우를 고려하여 index에 조건을 설정해주어야 한다.

profile
티스토리로 이사했습니다 🏠

0개의 댓글