2가지 방법 다 알고 있어야 함

이웃한 요소가 없으면?

주의!!

아래 코드를 보면 예외 처리를 일일이 했음

잘못된 예외 처리 (인덱스 고정)

현재 코드는 인덱스가 범위를 벗어나면 0이나 n-1로 강제 고정 이 경우, 격자 끝에 있는 칸들은 존재하지 않는 이웃 대신 자기 자신 혹은 엉뚱한 벽 끝값과 불필요하게 계산을 계속 수행하게 된다.

무엇보다 조건 4개 다 쓰는 거는 하나 실수로 틀리면 디버깅 어려움!!

T = int(input())
# 델타 탐색  
for test_case in range(1, T + 1):  
    # ///////////////////////////////////////////////////////////////////////////////////  
    n = int(input())  
    arr = [list(map(int, input().split())) for _ in range(n)]  
    dy = [-1, 1, 0, 0]  
    dx = [0, 0, -1, 1] # 상 하 좌 우  
    ans = 0  
    for i in range(n):  
        for j in range(n): # 전체 arr 탐색  
            for k in range(4): # delta 탐색  
                nxt_i = i + dx[k]  
                nxt_j = j + dy[k]  
  
            # 범위 체크!!!  
            # 또 다른 방법  
            # for di, dj in ((-1, 0), (1,0), (0,-1), (0,1)):  
            #     ni = i + dx            #     nj = j + dy                #if 0<=nxt_i<n and 0<=nxt_j<n:  
                if nxt_i<0:  
                    nxt_i = 0  
  
                elif nxt_i>=n:  
                    nxt_i = n-1  
  
                elif nxt_j<0:  
                    nxt_j = 0  
  
                elif nxt_j>=n:  
                    nxt_j = n-1  
  
                ans += abs(arr[i][j] - arr[nxt_i][nxt_j])   
    print(f'#{test_case} {ans}')
T = int(input())  
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.  
# 델타 탐색  
for test_case in range(1, T + 1):  
    n = int(input())  
    arr = [list(map(int, input().split())) for _ in range(n)]  
    dy = [-1, 1, 0, 0]  
    dx = [0, 0, -1, 1] # 상 하 좌 우  
    ans = 0  
    for i in range(n):  
        for j in range(n): # 전체 arr 탐색  
            for k in range(4): # delta 탐색  
                nxt_i = i + dx[k]  
                nxt_j = j + dy[k]  
  
            # 범위 체크!!!  
            # 또 다른 방법  
            # for di, dj in ((-1, 0), (1,0), (0,-1), (0,1)):  
            #     ni = i + dx            
            #     nj = j + dy                
            if 0 <= nxt_i < n and 0 <= nxt_j <n:  
                    ans += abs(arr[i][j] - arr[nxt_i][nxt_j])  
    print(f'#{test_case} {ans}')

정답 코드: if 0 <= nxt_i < n and 0 <= nxt_j <n: 조건 처리 한 방에 함, 그냥 범위에 포함되는 것만 계산. 단, 위에 탐색 전체 범위는 range(n)으로 해야 끝의 원소까지 계산 됨.