백준에서 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문만 집중적으로 살펴보자.
pointX = x + 0 = x
pointY = y + (-1) = y - 1
행은 변화가 없고, 열이 하나 줄었으므로 왼쪽 노드의 좌표이다.
pointX = x + 0 = x
pointY = y + 1
행은 변화가 없고, 열이 하나 늘었으므로 오른쪽 노드의 좌표이다.
pointX = x + (-1) = x - 1
pointY = y + 0 = y
행은 하나 줄었고, 열은 변화가 없으므로 위쪽 노드의 좌표이다.
pointX = x + 1
pointY = y + 0 = y
행은 하나 늘었고, 열은 변화가 없으므로 아래쪽 노드의 좌표이다.
예를 들어 기준 노드의 좌표가 (0, 0)이라고 하면
오른쪽 노드, 아래쪽 노드는 존재하지만 왼쪽 노드, 위쪽 노드는 존재하지 않는다.
이런 경우를 고려하여 index에 조건을 설정해주어야 한다.