Lv.2 - n^2 배열 자르기

송철진·2023년 5월 18일
0
post-custom-banner

문제 설명

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

n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

시도, 시간초과

function solution(n, left, right) {
    const arr = []
    let mok = 0
    for(let i=0; i<=right;i++){
      if(i%n === 0) mok = parseInt(i/n)
      if(i>=left) arr.push((i%n)+1+mok)
      if(mok>0) mok--
    }
    return arr
}

내가 찾아낸 규칙은 예를 들어 n=4 라면
[1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4] 에서
[0 0 0 0 1 0 0 0 2 1 0 0 3 2 1 0] 을 더해주면
원하는 배열
[1 2 3 4 2 2 3 4 3 3 3 4 4 4 4 4] 를 구할 수 있다.
나머지와 몫 연산을 이용해서 for문을 1번만 사용해서(O(n)) 구하고자 했는데 left미만일 때의 mok을 생각하지 못해 시간초과가 발생했다.
간단히 풀 수 있을거라 생각했는데 시간이 너무 오래 걸려서 다른 풀이를 학습하기로 했다.

solution

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;
}

index를 n으로 나눈 나머지 i%n
index를 n으로 나눈 몫 parseInt(i/n)큰 값+1
배열에 넣는다

n = 3
i: 		[0 1 2 3 4 5 6 7 8]
i%n: 	[0 1 2 0 1 2 0 1 2]
몫:		[0 0 0 1 1 1 2 2 2]
max+1:	[1 2 3 2 2 3 3 3 3]
profile
검색하고 기록하며 학습하는 백엔드 개발자
post-custom-banner

0개의 댓글