본문 바로가기
Coding Test/JavaScript

[Javascript] (프로그래머스 level 2) n^2 배열 자르기

by Chaedie 2022. 12. 15.
728x90

💡 구글에 Javascript 풀이가 많이 없거나, 배운 점이 있으면 포스팅합니다.

내 풀이

// 최대 차수 n까지    
// 해당 차수의
    // 행 채우기
    // 열 채우기
function solution(n, left, right) {
    const arr = Array(n).fill().map((x) => Array(n))
    
    for (let k = 0; k < n; k++) {
        arr[k][k] = k + 1
        for (let i = 0; i < k; i++) {
            arr[k][i] = k + 1
            arr[i][k] = k + 1
        }
    }
    
    const firstOrder = arr.flat()
    return firstOrder.slice(left, right + 1)
}

위와 같이 하면 로직은 맞다.

하지만 채점 하면 메모리 부족으로 에러 메시지 signal: aborted (core dumped) 로 실패가 뜬다.

그럼 문제 설명의 움짤처럼 만드는게 아니라 처음부터 1차원배열로 만들거나 일정한 규칙에 맞도록 계산식을 만들어야 하나보다.

그럼 2가지 방법 중 더 쉬울것 같은 1차원배열로 만들기를 해보자.

아래에 1차원 배열로 숫자를 적어보았다. 규칙성이 보이지 않는가? 이걸 이제 식으로 만들어내면 되겠다.

1
12 22
123 223 333
1234 2234 3334 4444
12345 22345 33345 44445 55555

“식을 만든다” 라고 이야기하자마자 스스로 움찔하는게 느껴진다. 수학을 잘하는 사람은 아니라는 무의식적인 두려움일것 같다. 그래도 해보자 ㅎㅎ 하다 보면 잘할수도있다 ㅋㅋ

n까지는 순서대로 12345…n
n으로 나누어 1이 나오는 부분 부턴 22345…n
n으로 나누어 2가 나오는 부분 부턴 33345…n
…
n으로 나누어 x가 나오는 부분 부턴 xxxxxx x+1 x+2 … n

통과 한 내 풀이

function solution(n, left, right) {
    const result = []
    
    for (let index = left; index <= right; index++) {
         const order = Math.ceil((index + 1) / n)
        const normalNum = (index) % n + 1

        if (normalNum < order) {
            result.push(order) 
        } else {
            result.push(normalNum)
        }
    }
    
    return result
}

console.log(solution(3,0,9))

1차원으로 만들려고 하니 현재 차수를 알아야하고, 1차일경우의 숫자를 알아야하더라. (order, normalNum)

이걸 아는 상태라면 for문 이용해서 left부터 right까지 order를 넣을것인지 normalNum을 넣을것인지 판별만 해주면 1차원으로 간단하게 뿌려줄수있었다.

배운 점, 느낀 점

뭔가 수식을 세워야 한다는 생각을 하니 걱정부터 되었는데, 작은 차수의 배열부터 차근차근 만들어보고 계산해보니 일반식까지 계산할 수 있었다. 역시 뭐든지 “잘게 쪼개어 해결해나가면” 해결할 수 있는 문제들이다. 꾸준히! 해보자!

댓글