프로그래머스 : JavaScript 알고리즘 100일 챌린지 50일차
- 프로그래머스 : https://school.programmers.co.kr/learn/challenges/training?order=acceptance_desc
- 유트브 참고 : https://www.youtube.com/watch?v=RMmOU2u-_as&list=PLkfUwwo13dlWZxOdbvMhkzhAowaiEjuGS
코딩 기초 트레이닝 Day50
1. 정수를 나선형으로 배치하기 : 양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n² 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
function solution(n) {
var answer = [[]];
return answer;
}
길라잡이
- 데이터를 수정해서 답을 구해보세요.
- 예시
n | result |
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]] |
답 확인하기
function solution(n) {
const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
const answer = Array.from(Array(n), () => Array(n).fill(0))
let x = 0, y = 0, dir = 0, num = 1;
while(num <= n**2) {
answer[x][y] = num;
let nextX = x + move[dir][0];
let nextY = y + move[dir][1];
if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) {
dir = (dir + 1) % 4;
nextX = x + move[dir][0];
nextY = y + move[dir][1];
}
x = nextX;
y = nextY;
num++;
}
return answer;
}
해설 확인하기
코드는 "달팽이 배열(Snail Array)"을 생성하는 함수입니다. 입력값 n에 따라 n x n 크기의 배열을 생성하고, 숫자 1부터 n의 제곱까지 순서대로 배열에 채웁니다. 이때, 숫자는 달팽이 모양으로 배열에 배치됩니다.
코드를 한 줄씩 분석해보겠습니다:
const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
move 배열은 달팽이 배열 생성에 사용되는 방향을 정의합니다. [0, 1]은 오른쪽, [1, 0]은 아래쪽, [0, -1]은 왼쪽, [-1, 0]은 위쪽을 의미합니다.
const answer = Array.from(Array(n), () => Array(n).fill(0));
answer는 n x n 크기의 2차원 배열로 초기화됩니다. 모든 요소는 0으로 채워집니다.
let x = 0, y = 0, dir = 0, num = 1;
x와 y는 현재 위치의 행과 열을 나타냅니다.
dir은 현재 이동 방향을 나타내며, 초기값은 0으로 설정됩니다.
num은 배열에 채워질 숫자를 나타냅니다. 초기값은 1로 설정됩니다.
while(num <= n**2) { ... }
num이 n의 제곱보다 작거나 같은 동안 반복합니다. 즉, 1부터 n의 제곱까지 숫자를 배열에 채우게 됩니다.
answer[x][y] = num;
현재 위치에 num 값을 할당합니다.
let nextX = x + move[dir][0];
현재 위치에서 다음 이동할 행의 위치를 계산합니다.
move[dir][0]은 현재 방향에 따른 행 이동량을 의미합니다.
let nextY = y + move[dir][1];
현재 위치에서 다음 이동할 열의 위치를 계산합니다.
move[dir][1]은 현재 방향에 따른 열 이동량을 의미합니다.
if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) { ... }
다음 이동할 위치가 배열의 범위를 벗어나거나 이미 값이 채워진 경우에 해당합니다.
이 경우, 다음 방향으로 전환합니다. (dir = (dir + 1) % 4)
그리고 다시 다음 이동할 위치를 계산합니다.
x = nextX; y = nextY;
현재 위치를 다음 이동할 위치로 갱신합니다.
num++;
num 값을 1 증가시킵니다.
return answer;
완성된 달팽이 배열을 반환합니다.
2. 특별한 이차원 배열2 : n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.
- 0 ≤ i, j < n인 정수 i, j에 대하여 arr[i][j] = arr[j][i]
function solution(arr) {
var answer = 0;
return answer;
}
길라잡이
- 데이터를 수정해서 답을 구해보세요.
- 예시
arr | result |
[[5, 192, 33], [192, 72, 95], [33, 95, 999]] | 1 |
[[19, 498, 258, 587], [63, 93, 7, 754], [258, 7, 1000, 723], [587, 754, 723, 81]] | 0 |
답 확인하기
function solution(arr) {
let flag = true
for(let i= 0 ; i < arr.length ; i ++) {
for(let j = 0 ; j < arr[i].length ; j ++) {
if(arr[i][j] !== arr[j][i]) {
flag = false
}
}
}
return ~~flag
}
해설 확인하기
코드는 2차원 배열 arr이 대칭 배열인지 확인하는 함수입니다. 대칭 배열이면 1을 반환하고, 아니면 0을 반환합니다.
let flag = true: flag 변수를 선언하고 초기값을 true로 설정합니다. 이 변수는 배열이 대칭인지 여부를 나타내는 플래그 역할을 합니다.
for(let i = 0; i < arr.length; i++) { ... }: 배열 arr의 각 행에 대해 반복합니다.
for(let j = 0; j < arr[i].length; j++) { ... }: 각 행의 열에 대해 반복합니다.
if(arr[i][j] !== arr[j][i]) { ... }: 현재 위치 (i, j)의 값과 대칭 위치 (j, i)의 값이 다르다면, 대칭 배열이 아니므로 flag를 false로 설정합니다.
return ~~flag: flag 값을 논리적으로 부정(false를 true로, true를 false로)하고, 그 결과를 정수로 변환하여 반환합니다. 이 때 ~~ 연산자를 사용하여 부정과 정수 변환을 동시에 수행합니다.
따라서, 해당 함수는 2차원 배열 arr이 대칭 배열인지 확인하고 그 결과를 반환합니다. 반환 값으로 1은 대칭 배열을 나타내며, 0은 대칭 배열이 아님을 나타냅니다.
3. 정사각형으로 만들기 : 이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
function solution(arr) {
var answer = [[]];
return answer;
}
길라잡이
- 데이터를 수정해서 답을 구해보세요.
- 예시
arr | result |
[[572, 22, 37], [287, 726, 384], [85, 137, 292], [487, 13, 876]] | [[572, 22, 37, 0], [287, 726, 384, 0], [85, 137, 292, 0], [487, 13, 876, 0]] |
[[57, 192, 534, 2], [9, 345, 192, 999]] | [[57, 192, 534, 2], [9, 345, 192, 999], [0, 0, 0, 0], [0, 0, 0, 0]] |
[[1, 2], [3, 4]] |
[[1, 2], [3, 4]] |
답 확인하기
function solution(arr) {
const rowLen = arr.length
const colLen = arr[0].length
if(rowLen > colLen) {
const gab = Array(rowLen-colLen).fill(0)
return arr.map(a => [...a, ...gab])
}
if(colLen > rowLen) {
for(let i = 0 ; i < colLen-rowLen ; i ++) {
const gab = Array(colLen).fill(0)
arr.push(gab)
}
}
return arr
}
해설 확인하기
코드는 2차원 배열 arr을 정사각형 형태로 만들기 위해 배열의 행 또는 열에 0을 추가하는 함수입니다. 코드를 한 줄씩 분석해보겠습니다:
const rowLen = arr.length: 배열 arr의 행 수를 rowLen 변수에 저장합니다.
const colLen = arr[0].length: 배열 arr의 첫 번째 행의 열 수를 colLen 변수에 저장합니다.
if(rowLen > colLen) { ... }: 행 수가 열 수보다 큰 경우를 처리합니다.
const gab = Array(rowLen-colLen).fill(0): 추가해야 할 0의 개수만큼 0으로 채워진 배열 gab을 생성합니다.
return arr.map(a => [...a, ...gab]): 배열 arr의 각 행에 배열 gab을 추가하여 새로운 배열을 생성하여 반환합니다. 이 때, ... 문법을 사용하여 배열을 확장합니다. 따라서, 행에 0을 추가하여 정사각형 배열을 생성합니다.
if(colLen > rowLen) { ... }: 열 수가 행 수보다 큰 경우를 처리합니다.
for(let i = 0 ; i < colLen-rowLen ; i ++) { ... }: 추가해야 할 행의 개수만큼 반복합니다.
const gab = Array(colLen).fill(0): 0으로 채워진 길이가 colLen인 배열 gab을 생성합니다.
arr.push(gab): 배열 arr에 gab을 추가하여 새로운 행을 생성합니다.
return arr: 배열 arr을 반환합니다. 이 때, 열 수가 행 수보다 크거나 같은 경우에는 행을 추가하여 정사각형 배열로 만들어진 결과를 반환합니다. 열 수가 행 수보다 작은 경우에는 원래의 배열 arr를 그대로 반환합니다.
따라서, 해당 함수는 2차원 배열 arr을 정사각형 형태로 만들기 위해 필요한 0을 추가한 결과를 반환합니다.
4. 이차원 배열 대각선 순회하기 : 2차원 정수 배열board와 정수k가 주어집니다. i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.
function solution(board, k) {
var answer = 0;
return answer;
}
길라잡이
- 데이터를 수정해서 답을 구해보세요.
- 예시
board | k | result |
[[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]] | 2 | 8 |
답 확인하기
function solution(board, k) {
var answer = 0;
for (let i = 0; i < board.length; i += 1) {
for (let j = 0; j < board[0].length; j += 1) {
if (i + j <= k) {
answer += board[i][j];
}
}
}
return answer;
}
해설 확인하기
코드는 2차원 배열 board에서 k 이하의 인덱스 합을 구하는 함수입니다. 코드를 한 줄씩 분석해보겠습니다:
var answer = 0;: 결과를 저장할 변수 answer를 초기화합니다.
for (let i = 0; i < board.length; i += 1) { ... }: 배열 board의 각 행에 대해 반복합니다.
for (let j = 0; j < board[0].length; j += 1) { ... }: 현재 행의 각 열에 대해 반복합니다.
if (i + j <= k) { ... }: 현재 위치의 행 인덱스 i와 열 인덱스 j의 합이 k 이하인 경우를 확인합니다.
answer += board[i][j];: 조건을 만족하는 위치의 값을 answer에 더합니다.
return answer;: 결과인 answer를 반환합니다.
따라서, 해당 함수는 2차원 배열 board에서 행 인덱스와 열 인덱스의 합이 k 이하인 위치의 값들을 모두 더한 결과를 반환합니다.