본문 바로가기
카테고리 없음

프로그래머스 : JavaScript 알고리즘 100일 챌린지 50일차

by dongjin6539 2023. 7. 4.
728x90
반응형

프로그래머스 : JavaScript 알고리즘 100일 챌린지 50일차

 

코딩 기초 트레이닝 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 이하인 위치의 값들을 모두 더한 결과를 반환합니다.

728x90
반응형