읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- JavaScript 배열: 인덱스 조회와 삽입·삭제 비용배열은 여러 값을 순서대로 담습니다. 인덱스로 값을 읽고 반복문으로 하나씩 살펴봅니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 완전탐색과 격자 · 알고리즘 개념
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
2차원 배열의 행·열 합과 상하좌우 이웃은 어떤 좌표 규칙으로 탐색하나요?
2차원 배열에서는 행 r과 열 c를 따로 움직입니다. 행·열의 합을 구할 때와 이웃 네 칸을 비교할 때 사용할 좌표 규칙을 구분하면 됩니다.

[[1,2,3],[4,5,6],[7,8,9]]의 마지막 행 합은 7+8+9=24입니다. 가운데 칸의 상하좌우 값은 2, 8, 4, 6입니다.
적용 조건·범위: [[5]]는 바깥의 0 네 개보다 높아 봉우리 한 개입니다. 같은 높이가 붙어 있으면 엄격히 더 높다는 조건을 만족하지 못합니다. 직사각형 이웃 탐색에는 rows와 cols를 따로 쓰지만, 앞의 두 대각선 합 함수는 N×N 정사각형만 받습니다.

이 글에서 할 일: 행·열·대각선과 네 방향 이웃의 좌표를 안전하게 계산합니다. 선수 지식: 배열 인덱스·중첩 반복문.
행·열·두 대각선을 따로 더합니다
JavaScript 예제: 격자의 각 행·열·두 대각선의 합을 비교해 가장 큰 값을 구합니다. 아래 코드와 실행 결과, 좌표 표를 함께 보며 각 합이 어떻게 계산되는지 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

function maxLineSum(grid) {
// 계약: 비어 있지 않은 N × N 숫자 격자
const n = grid.length;
let best = -Infinity;
let main = 0;
let anti = 0;
for (let i = 0; i < n; i++) {
let row = 0;
let column = 0;
for (let j = 0; j < n; j++) {
row += grid[i][j];
column += grid[j][i];
}
best = Math.max(best, row, column);
main += grid[i][i];
anti += grid[i][n - 1 - i];
}
return Math.max(best, main, anti);
}
console.log(maxLineSum([[1, 2, 3], [4, 5, 6], [7, 8, 9]]));
실행 결과
24
| 대상 | 좌표 | 움직이는 값 |
|---|---|---|
| 행 i | grid[i][j] | j 증가 |
| 열 i | grid[j][i] | j 증가 |
| 주대각선 | grid[i][i] | 행·열 함께 증가 |
| 반대각선 | grid[i][N-1-i] | 행 증가·열 감소 |
한 행·열을 마치면 두 합과 지금까지의 최댓값을 비교합니다. 대각선은 각 행마다 해당 칸 하나씩 더합니다. 두 대각선의 가운데 칸은 각각의 선에 속하므로 각 대각선 합에 한 번씩 들어갑니다. 모든 선의 합을 한데 더하는 문제가 아닙니다.
내 컴퓨터에서 직접 실행하기 — 행·열·대각선 합 예제 (선택)
코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.
준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.
- 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
- 그 폴더 안에
grid-lines.js파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막console.log줄도 포함하며, 파일 이름 끝이.js.txt가 되지 않도록 확인합니다. - VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version
v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.
터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.
node grid-lines.js
터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.
이웃 좌표를 만든 뒤 범위를 확인합니다
JavaScript 예제: 각 칸을 상하좌우 이웃과 비교해 봉우리의 개수를 구합니다. 아래 코드와 두 실행 결과를 보며 격자 안팎의 값을 어떻게 비교하는지 살펴보세요. 직접 실행하지 않아도 설명을 따라갈 수 있습니다.

function countPeaks(grid) {
// 계약: 비어 있지 않은 직사각형, 높이는 양수, 바깥 높이는 0
const rows = grid.length;
const cols = grid[0].length;
const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
let count = 0;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
let peak = true;
for (const [dr, dc] of directions) {
const nr = r + dr;
const nc = c + dc;
const inside = nr >= 0 && nr < rows && nc >= 0 && nc < cols;
const neighbor = inside ? grid[nr][nc] : 0;
if (neighbor >= grid[r][c]) { peak = false; break; }
}
if (peak) count++;
}
}
return count;
}
console.log(countPeaks([[1, 3, 1], [2, 1, 4]]));
console.log(countPeaks([[5]]));
실행 결과
3
1
현재 칸이 (r,c)라면 위는 (r-1,c), 아래는 (r+1,c), 왼쪽은 (r,c-1), 오른쪽은 (r,c+1)입니다. 값을 읽기 전에 0 ≤ nr < rows와 0 ≤ nc < cols를 모두 확인합니다.
위 봉우리 예제는 양수 높이와 바깥 높이 0을 전제로 합니다. 네 방향 중 같거나 더 높은 칸이 하나라도 있으면 봉우리가 아닙니다. 대각선은 비교하지 않습니다. 배열 테두리에 0을 붙이는 패딩도 가능하지만 바깥 높이의 의미는 문제 조건과 같아야 합니다.
내 컴퓨터에서 직접 실행하기 — 봉우리 개수 예제 (선택)
코드를 직접 바꿔보고 싶은 분을 위한 안내입니다. 이 과정은 방문자 자신의 컴퓨터에서 진행하며, 글을 읽기 위해 반드시 실행할 필요는 없습니다.
준비물: Node.js와 코드 편집기인 Visual Studio Code(VS Code). Node.js는 JavaScript 파일을 컴퓨터에서 실행하는 프로그램입니다. 아직 설치하지 않았다면 두 프로그램의 공식 사이트에서 설치한 뒤 진행하세요.
- 컴퓨터에 연습용 폴더를 하나 만들고, VS Code에서 파일 → 폴더 열기로 그 폴더를 엽니다.
- 그 폴더 안에
peaks.js파일을 만듭니다. 위의 JavaScript 예제 전체를 복사해 붙여넣고 저장하세요. 마지막console.log줄도 포함하며, 파일 이름 끝이.js.txt가 되지 않도록 확인합니다. - VS Code의 터미널 → 새 터미널을 선택합니다. 아래쪽에 열린 터미널은 명령어를 입력하는 창입니다. 다음 명령으로 Node.js 설치 여부를 확인합니다.
node --version
v로 시작하는 버전 번호가 나오면 실행할 수 있습니다. 명령을 찾을 수 없다는 메시지가 나오면 Node.js를 설치하고 VS Code를 완전히 닫았다가 다시 여세요.
터미널의 현재 위치가 방금 파일을 저장한 폴더인지 확인한 뒤, 다음 명령을 입력하고 Enter를 누릅니다. 이 명령은 JavaScript 파일 안이 아니라 터미널에 입력합니다.
node peaks.js
터미널에 나온 값을 위의 실행 결과와 비교하세요. Cannot find module이 나오면 파일 이름과 저장 여부, 터미널에서 연 폴더가 같은지 확인합니다.
한 칸·같은 높이·음수를 구분합니다
[[5]]는 바깥의 0 네 개보다 높아 봉우리 한 개입니다. 같은 높이가 붙어 있으면 엄격히 더 높다는 조건을 만족하지 못합니다. 직사각형 이웃 탐색에는 rows와 cols를 따로 쓰지만, 앞의 두 대각선 합 함수는 N×N 정사각형만 받습니다.

선의 최대합은 음수도 처리하도록 -Infinity에서 시작합니다. 반면 봉우리 예제는 양수 높이 전용입니다. 빈 격자나 들쭉날쭉한 행은 두 함수의 입력 계약 밖입니다.
N×N 선의 합은 O(N²) 시간, R×C 봉우리 탐색은 칸마다 최대 네 번 비교하므로 O(RC) 시간입니다. 이미 주어진 입력과 반환값을 제외한 추가 공간은 두 함수 모두 O(1)입니다.
직접 확인하고 문제에 적용하기
[[2,2],[1,1]]에서 봉우리는 몇 개일까요? [[-5]]의 선 최대합은 얼마일까요?

답과 이유 확인
봉우리는 0개입니다. 위쪽 두 칸은 옆 칸과 같은 높이입니다. 선 최대합은 -5이며, 최댓값을 0으로 시작하면 이 경우를 틀립니다.
참고 자료
자료 확인일: 2026년 10월 19일.
- Competitive Programmer’s Handbook — Antti Laaksonen — 7.3절의 격자 좌표와 행·열 표현.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 같은 쌍을 두 번 세지 않는 이유와 모서리·대각선의 좌표를 설명하세요.
이 개념으로 더 풀어보기
다음 추천 · 이 개념으로 풀 문제: 격자판 최대합 풀이: 행·열·대각선 합을 어떻게 비교할까요?
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 30개 · 필수 0개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.