https://school.programmers.co.kr/learn/courses/30/lessons/181832
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
제한사항
- 1 ≤ n ≤ 30
입출력 예nresult
4 | [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]] |
5 | [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]] |
ㅜㅡㅜ 이 문제는 너무 어렵소..
프로그래머스 정수를 나선형으로 배치하기 JS ( Array(), Array.from(), 중첩for문, n x n 2차원배열만들기
문제 설명 양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요. ✅ 코
hihiha2.tistory.com
row, col 을 인덱스로 하여 for 반복문 중첩으로 위치 이동(인덱스 값을 조정)하면서 값을 추가하는 방법
function solution(n) {
var arr = Array.from({length : n}, () => Array(n).fill(0));
let row = 0;
let col = 0;
let num = 1;
for (let i = n ; i > 0 ; i -= 2){ // 한 변의 길이가 2 씩 감소
for (let j = 0; j < i; j ++){
arr[row][col] = num ++;
col ++;
}
col --;
row ++;
for (let j = 0; j < i - 1; j++){
arr[row][col] = num ++;
row ++;
}
row --;
col --;
for (let j = 0; j < i - 1; j++) {
arr[row][col] = num++;
col--;
}
col++;
row--;
for (let j = 0; j < i - 2; j++) {
arr[row][col] = num++;
row--;
}
row++;
col++;
}
return arr;
}
[부트캠프 팀원님의 풀이]
// 배열을 회전하는 함수
function arrayTurn(arr) {
let n = arr.length;
let turnArr = Array.from(Array(n), () => Array(n).fill(0));
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
turnArr[n - j - 1][i] = arr[i][j];
}
}
return turnArr;
}
function solution(n) {
// 배열 초기화
let arr = Array.from(Array(n), () => Array(n).fill(0));
let num = 1;
while (num <= n ** 2) {
for (let i = 0; i < n; i++) {
// 배열에 0이 포함되어 있을 경우 실행
if (arr[i].includes(0)) {
for (let j = 0; j < n; j++) {
if (arr[i][j] === 0) {
arr[i][j] = num;
num++;
}
}
break;
}
}
arr = arrayTurn(arr);
}
// 배열의 [0][0]값이 1일때까지 회전
while (arr[0][0] !== 1) {
arr = arrayTurn(arr);
}
return arr;
}
arrayTurn : [n - j - 1][i] 위치의 있는 요소를 [i][j] 로 대체하는 함수
1. while 조건문
num = n ^ 2 이 될 때까지
2. for 반복문 (행 순회)
i = n - 1 까지
3. if + for 반복문 (열 순회)
배열에 0 값이 있다면 &
j = n - 1까지
0인 요소에 num 값을 할당하고, 행이 다 채워지면 break
arrayTurn 함수를 실행 => 배열 90도 회전
배열의 첫 번째 값이 1이 될 때까지 배열을 계속 회전
회전이 끝날 때마다 arr[0][0] 값을 체크해서 1이 될 때까지 회전 => 원래 배열 방향으로 회전
다들 어떻게 이렇게 쉽게 푸는거냐고.. !