LeetCode 54번 문제: 자바스크립트로 나선형 행렬 탐색 솔루션 분석 및 구현
2025-01-10 03:20:35javascriptprogrammingleetcodeinterview
LeetCode 문제 54: 나선형 행렬 - 자바스크립트 솔루션 🚀
LeetCode 54번 문제, 즉 나선형 행렬은 행렬을 나선형으로 순회하며 탐색하는 흔한 알고리즘 문제입니다. 이번 글에서는 이 문제의 해결 방법을 JavaScript로 구현하고, 문제를 단계별로 분석해보겠습니다.
문제 설명 🔍
주어진 m × n 행렬을 나선형 순서로 순회하며, 그 요소들을 단일 배열로 반환하는 것이 목표입니다. 이 문제는 행렬을 다루기 때문에 기본적인 배열 접근과 조건문의 사용이 중심이 됩니다.
문제 예시 ✨
예시 1
입력: matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
출력: [1, 2, 3, 6, 9, 8, 7, 4, 5]
예시 2
입력: matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
출력: [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
구현 방법 🏆
자바스크립트 솔루션
이 문제를 해결하기 위해 네 가지 경계를 정의하고, 이 경계를 줄여가면서 행렬을 나선형 순서로 순회합니다.
var spiralOrder = function(matrix) {
const result = [];
let top = 0;
let bottom = matrix.length - 1;
let left = 0;
let right = matrix[0].length - 1;
while (top <= bottom && left <= right) {
for (let i = left; i <= right; i++) {
result.push(matrix[top][i]);
}
top++;
for (let i = top; i <= bottom; i++) {
result.push(matrix[i][right]);
}
right--;
if (top <= bottom) {
for (let i = right; i >= left; i--) {
result.push(matrix[bottom][i]);
}
bottom--;
}
if (left <= right) {
for (let i = bottom; i >= top; i--) {
result.push(matrix[i][left]);
}
left++;
}
}
return result;
};
동작 원리 및 이해 🔍
경계 정의
top: 가장 윗부분의 행을 기록합니다.bottom: 가장 아랫부분의 행을 기록합니다.left: 가장 왼쪽의 열을 기록합니다.right: 가장 오른쪽의 열을 기록합니다.
나선형 순서로 순회
- 좌에서 우로: 위쪽 가장자리 행을 탐색하여
top을 증가시킵니다. - 위에서 아래로: 오른쪽 가장자리 열을 탐색하여
right를 감소시킵니다. - 우에서 좌로: 만약 아래쪽 행이 남아있다면 탐색하여
bottom을 감소시킵니다. - 아래에서 위로: 만약 왼쪽 열이 남아있다면 탐색하여
left를 증가시킵니다.
경계 중첩 검사
각 방향으로의 탐색 전에 경계가 서로 중첩되지 않는지 확인해야 합니다. 이는 모든 요소를 정확히 한 번만 수집하게 하는 중요 요소입니다.
복잡도 분석 🔑
- 시간 복잡도: O(m ⋅ n), 여기서 m은 행의 수, n은 열의 수입니다. 모든 요소를 한 번씩 처리하기 때문입니다.
- 공간 복잡도: O(1), 결과 배열을 위한 공간을 제외하면 추가적인 공간 사용이 거의 없습니다.
디버깅과 최적화 📋
입력: matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
출력: [1, 2, 3, 6, 9, 8, 7, 4, 5]
프로 팁 ✨
제약 조건 명확히 하기
- 입력 행렬이 빈 경우가 가능한지 질문하세요.
- 비정형 행렬이 가능한지 확인하세요(보통 가능하지 않지만 확실히 할 필요가 있습니다).
중요한 케이스 논의하기
- 단일 행으로 구성된 행렬:
[[1, 2, 3]] - 단일 열로 구성된 행렬:
[[1], [2], [3]] - 가능한 가장 작은 행렬:
[[1]]
효율성 강조하기
- 경계를 줄이는 접근 방식이 O(m ⋅ n)임을 설명하며 효율성을 보여주세요.
추가적으로 읽어볼 자료 📚
아래 링크에서 전체 설명과 코드 워크스루를 확인하세요:
Dev.to Post: Valid Sudoku - JavaScript Solution
당신이 이 문제를 푸는 데 선호하는 방법은 무엇인지 논의해봅시다! 🚀