본문 바로가기
Developer/Algorithm

프로그래머스 코딩테스트 연습 Level 2 - n^2 배열 자르기 (JavaScript)

by roqkfrlfhr 2022. 7. 21.

프로그래머스 코딩테스트 연습 Level 2 - n^2 배열 자르기 (JavaScript)

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 2 중,

[n^2 배열 자르기] 문제를 JavaScript를 사용하여 해결해 보도록 하겠습니다.

 

문제

문제 설명

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ n ≤ 107
  • 0 ≤ left ≤ right < n2
  • right - left < 105

 

입출력 예

n left right result
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

 

입출력 예 설명

입출력 예 #1

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

출처 : 프로그래머스 코딩테스트 연습 - n^2 배열 자르기 (https://school.programmers.co.kr/learn/courses/30/lessons/87390?language=javascript)

입출력 예 #2

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

출처 : 프로그래머스 코딩테스트 연습 - n^2 배열 자르기 (https://school.programmers.co.kr/learn/courses/30/lessons/87390?language=javascript)

 

 

작성한 답

solution.js

function solution(n, left, right) {
    return Array.from({length: right - left + 1}, (_, i) => {
        const place = i + left;
        return Math.max(place % n, Math.floor(place / n)) + 1;
    });
}

 

설명

그림 설명이 너무 자세하게 나와있어서 해결 방식을 생각해보기가 좋았습니다.

 

그림과 설명에서 2차원 배열을 만든 뒤 한 행씩 잘라서 이어 붙이는 것으로 보여주고 있는데요.

이어 붙여진 배열에 들어간 값이 어떠한 규칙을 가지고 있는지 파악하면 문제를 간단하게 해결할 수 있습니다.

 

입출력 예 2번째를 예시로 들어보겠습니다.

2차원 배열을 만들면,

[

  [1, 2, 3, 4],

  [2, 2, 3, 4],

  [3, 3, 3, 4],

  [4, 4, 4, 4],

]

위와 같이 만들어지고, 이 2차원 배열을 이어붙이면,

[1, 2, 3, 4, 2, 2, 3, 4, 3, 3, 3, 4, 4, 4, 4, 4] 가 됩니다.

여기에서 규칙을 찾을 수 있습니다.

각 자리에들어가는 숫자는 기본적으로 1, 2, 3, 4가 됩니다. 즉 [index % n + 1] 입니다.

하지만 각 [Math.floor(index / n) + 1] 을  값이 더 크다면 해당 값으로 대체되게 됩니다.

이 방식을 잘 이해하면 이제 문제를 해결할 수 있습니다.

 

여러가지 방법으로 문제를 해결할 수 있겠지만,

제가 사용한 방법의 경우 Array.from()을 사용하여 left부터 right 까지 길이의 배열을 생성하여,

내부에서 해당 자리 place를 index+left 를 통해 구하고 위에서 설명드린 방법으로 배열에 값을 넣으며 초기화해준 뒤,

해당 배열을 반환하는 것으로 문제를 해결할 수 있습니다.

 

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글