728x90

Q. 정수 n을 입력받고, nxn 크기 나선형 행렬(달팽이)를 출력하라.

--- Examples
matrix(2)
  [[1, 2],
  [4, 3]]
matrix(3)
  [[1, 2, 3],
  [8, 9, 4],
  [7, 6, 5]]
matrix(4)
  [[1,   2,  3, 4],
  [12, 13, 14, 5],
  [11, 16, 15, 6],
  [10,  9,  8, 7]]

Code

https://github.com/DasolPark/Algorithm_DataStructure_JavaScript-Stephen-/blob/c456c4847e03dd60761c331dc67895c09fefb0be/exercises/matrix/index.js

😢 행렬(2차원 배열)의 패턴을 파악하는 것이 핵심!
3X3 행렬 Test Case를 그려놓고 패턴을 파악하다보니 마지막 for loop의 진행 방향을 놓쳤었다.
진행 순서를 눈으로 확인하기 위해, 진행되는 값을 출력해 보았더니 훨씬 이해가 쉬웠다(Full Code 밑에 추가)

😊 먼저, 행렬(2차원 배열)을 초기화 해주기 위해 for loop으로 n(행)만큼 array를 추가해주었다.
그리고 1부터 값을 증가해주기 위해 count를 선언해주고, 0부터 n-1까지 startRow(Column), endRow(Column)을 각각 선언해준다.
while loop을 이용해 각 StartRow(Column)와 endRow(Column)가 같은 값을 가질 때까지 반복해준다.
(StartRow(Column)는 EndRow(Column)보다 커질 수 없고, EndRow(Column)은 음수가 될 수 없다)

그리고 변경되어야하는 row 또는 column을 중심으로 i를 선언해주고 count값을 증가하며 넣어준다.
해당 row나 column작업이 끝나면 증가 또는 감소시켜준다.

패턴을 찾아줘야하는 알고리즘이기 때문에 특별한 helper method skill은 없다.

Spiral Matrix Pseudo Code

Full Code

function matrix(n) {
const results = [];
 
for (let i = 0; i < n; i++) {
results.push([]);
}
 
let counter = 1;
let startColumn = 0;
let endColumn = n - 1;
let startRow = 0;
let endRow = n - 1;
while (startColumn <= endColumn && startRow <= endRow) {
// Top row
for (let i = startColumn; i <= endColumn; i++) {
results[startRow][i] = counter;
counter++;
}
startRow++;
 
// Right column
for (let i = startRow; i <= endRow; i++) {
results[i][endColumn] = counter;
counter++;
}
endColumn--;
 
// Bottom row
for (let i = endColumn; i >= startColumn; i--) {
results[endRow][i] = counter;
counter++;
}
endRow--;
 
// Start column
for (let i = endRow; i >= startRow; i--) {
results[i][startColumn] = counter;
counter++;
}
startColumn++;
}
 
return results;
}

Spiral Matrix Code For Visual(진행 순서를 눈으로 확인하기 위한 Code)

// For Visual
 
// function matrix(n) {
// const results = [];
 
// for (let i = 0; i < n; i++) {
// results.push([]);
// }
 
// let counter = 1;
// let startColumn = 0;
// let endColumn = n - 1;
// let startRow = 0;
// let endRow = n - 1;
// while (startColumn <= endColumn && startRow <= endRow) {
// // Top Row
// for (let i = startColumn; i <= endColumn; i++) {
// results[startRow][i] = counter;
// console.log('1st', counter);
// counter++;
// }
// startRow++;
 
// // Right Column
// for (let i = startRow; i <= endRow; i++) {
// results[i][endColumn] = counter;
// console.log('2nd', counter);
// counter++;
// }
// endColumn--;
 
// // Bottom Row
// for (let i = endColumn; i >= startColumn; i--) {
// results[endRow][i] = counter;
// console.log('3rd', counter);
// counter++;
// }
// endRow--;
 
// // Start Column
// for (let i = endRow; i >= startRow; i--) {
// results[i][startColumn] = counter;
// console.log('4th', counter);
// counter++;
// }
// startColumn++;
// }
 
// return results;
// }
 
// console.log(matrix(3));
// console.log(matrix(4));

 

+ Recent posts