문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
이 코드는 입력된 숫자 n에 따라 nxn 크기의 2차원 배열을 생성하고, 시계방향으로 숫자를 채우는 함수이다.
- 우선, 크기 n의 2차원 배열 arr을 생성한다. 모든 요소는 0으로 초기화된다.
- num 변수를 1로 초기화한다. 이 변수는 배열에 할당될 증가하는 숫자를 나타낸다.
- 현재 행을 나타내는 row 변수와 현재 열을 나타내는 col 변수를 0으로 초기화한다.
- 이동 방향을 나타내는 direction 변수를 "right"로 초기화한다. 이 변수는 "right" (오른쪽), "down" (아래쪽), "left" (왼쪽), "up" (위쪽) 네 가지 중 하나의 값을 가진다.
- for 루프를 통해 1부터 nxn까지의 숫자를 배열에 할당한다. 루프는 i 변수가 0부터 nxn 미만일 때까지 반복된다.
- 현재 위치인 arr[row][col]에 num 값을 할당한다.
- 현재 이동 방향에 따라 다음 위치를 결정한다. 다음 위치에 이미 값이 있거나 배열의 경계에 도달한 경우 방향을 변경한다.
- "right" 방향: 우측 경계에 도달하거나 다음 위치에 이미 값이 있는 경우 방향을 "down"으로 변경하고, 행(row)을 증가시킨다. 그렇지 않은 경우 열(col)을 증가시킨다.
- "down" 방향: 하단 경계에 도달하거나 다음 위치에 이미 값이 있는 경우 방향을 "left"로 변경하고, 열(col)을 감소시킨다. 그렇지 않은 경우 행(row)을 증가시킨다.
- "left" 방향: 좌측 경계에 도달하거나 다음 위치에 이미 값이 있는 경우 방향을 "up"으로 변경하고, 행(row)을 감소시킨다. 그렇지 않은 경우 열(col)을 감소시킨다.
- "up" 방향: 상단 경계에 도달하거나 다음 위치에 이미 값이 있는 경우 방향을 "right"로 변경하고, 열(col)을 증가시킨다. 그렇지 않은 경우 행(row)을 증가시킨다.
증가 연산자(++)를 변수 앞에서 사용하는 경우와 변수 뒤에서 사용하는 경우의 차이점은 다음과 같다.
// 변수 앞에 증가 연산자(++)를 사용하는 경우
// 이 경우, 변수 a의 값은 1 증가한 후에 변수 b에 대입된다.
// 즉, a는 6이 되고, b도 6이다.
let a = 5;
let b = ++a;
console.log(a);
// Expected output: "a:6"
console.log(b);
// Expected output: "b:6"
// 변수 뒤에 증가 연산자(++)를 사용하는 경우
// 이 경우, 변수 a의 값은 변수 b에 대입된 후에 1 증가한다.
// 즉, a는 6이 되고, b는 5가 된다.
let a = 5;
let b = a++;
console.log(a);
// Expected output: "a:6"
console.log(b);
// Expected output: "b:5"
정답
function solution(n) {
const arr = new Array(n).fill().map(() => new Array(n).fill(0)); // n x n 배열 생성
let num = 1; // 값 증가 변수 초기화
let row = 0; // 현재 행
let col = 0; // 현재 열
let direction = "right"; // 이동 방향 초기화
for (let i = 0; i < n * n; i++) {
arr[row][col] = num++; // 현재 위치에 값 할당
if (direction === "right") {
if (col === n - 1 || arr[row][col + 1] !== 0) {
// 우측 경계에 도달하거나 다음 위치에 이미 값이 있는 경우
direction = "down"; // 아래로 이동
row++;
} else {
col++; // 우측으로 이동
}
} else if (direction === "down") {
if (row === n - 1 || arr[row + 1][col] !== 0) {
// 하단 경계에 도달하거나 다음 위치에 이미 값이 있는 경우
direction = "left"; // 왼쪽으로 이동
col--;
} else {
row++; // 아래로 이동
}
} else if (direction === "left") {
if (col === 0 || arr[row][col - 1] !== 0) {
// 좌측 경계에 도달하거나 다음 위치에 이미 값이 있는 경우
direction = "up"; // 위로 이동
row--;
} else {
col--; // 좌측으로 이동
}
} else if (direction === "up") {
if (row === 0 || arr[row - 1][col] !== 0) {
// 상단 경계에 도달하거나 다음 위치에 이미 값이 있는 경우
direction = "right"; // 우측으로 이동
col++;
} else {
row--; // 위로 이동
}
}
}
return arr;
}