본문 바로가기
코딩 테스트/알고리즘

알고리즘 87번 - n^2 배열 자르기 js

by GREEN나무 2025. 4. 11.
728x90

 

URL : https://school.programmers.co.kr/learn/courses/30/lessons/87390?language=javascript

문제

더보기

문제 설명

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

n n열 크기의 비어있는 2차원 배열을 만듭니다.

i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.

11열부터 i i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.

1, 2, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.

새로운 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차원 배열을 만드는 과정을 나타낸 것입니다.

입출력 예 #2

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

 


  JS

계획

 

1. 2차배열을 만들고 -> 1차배열로 바꾼 뒤 -> left ~ right 값을 가진 배열 출력

✅2. left ~ right 값만 만들어서 출력

 

1. left, right값을 n 으로 나눠서 행 열의 위치 찾기.

2.행보다 열의 값이 작거나 같으면 값은 행+1

3.행보다 열의 값이 크면 값은 열+1

4. left, right사이의 값을 배열로 만들어 출력


 

const solution = (n, left, right) => {
    let answer = [];

    for (let k = left; k <= right; k++) {
        const [iK, jK] = [Math.floor(k / n) + 1, (k % n) + 1];
        if (iK >= jK) {
            answer.push(iK);
        } else {
            answer.push(jK);
        }
    }
    return answer;
};

코드 간략화하기

const solution = (n, left, right) => {
    const answer = [];
    for (let k = left; k <= right; k++) {
        answer.push(Math.max(Math.floor(k / n), k % n) + 1);
    }
    return answer;
};

다른사람 답

function solution(n, left, right) {
    const result = [];
    
    // left부터 right까지 각 인덱스에 대해 값 계산
    for (let k = left; k <= right; k++) {
        const row = Math.floor(k / n); // 행 인덱스
        const col = k % n; // 열 인덱스
        const value = Math.max(row, col) + 1; // 해당 위치의 값
        result.push(value);
    }
    
    return result;
}
function solution(n, left, right) {
    var answer = [];

    for (let i = left; i <= right; i++) {
        answer.push(Math.max(i % n, parseInt(i / n)) + 1)
    }

    return answer;
}
const solution = (x,y,z) => Array.from({length:z-y+1},(_,index)=>(index+y)%x<parseInt((index+y)/x)+1?parseInt((index+y)/x)+1:(index+y)%x+1)
const solution = (x, y, z) => Array.from({length: z - y + 1}, (_, i) => Math.max(Math.floor((y + i) / x), (y + i) % x) + 1);

 

1. Array.from

  • Array.from({length: z - y + 1}, 매핑 함수):
    • z - y + 1right - left + 1, 즉 반환할 배열의 길이.
    • 이 메서드는 길이가 z - y + 1인 배열을 생성하며, 각 요소는 두 번째 인수(매핑 함수)의 결과로 채워짐.
    • 첫 번째 인수 {length: z - y + 1}는 배열-like 객체로, Array.from이 이를 기반으로 배열 생성.

2. 매핑 함수

  • (_, index) => ...:
    • _: 첫 번째 매개변수는 사용되지 않으므로 _로 표시 (관례).
    • index: 배열 인덱스 (0부터 z - y까지).
    • index + y: 실제 1차원 배열의 인덱스 k를 의미 (k = left + index, 즉 y + index).

참고

arr .from : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from