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

butterbeetle·2023년 4월 16일
0

코딩테스트

목록 보기
106/132
post-thumbnail

문제설명

정수 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 ≤ leftright < n2
  • right - left < 105

입출력 예

nleftrightresult
325[3,2,2,3]
4714[4,3,3,3,4,4,4,4]

내 풀이

처음엔 for문으로 반복하면서 left ~ right 까지 범위에 들어왔을때
answer에 넣도록 풀이했었다.

function solution(n, left, right) {
    var answer = [];
    let cnt = 0;
    for(let i=1; i<=n; i++){
        for(let j=1; j<=i; j++){
            if(cnt >= left && cnt <= right) answer.push(i)
            cnt++;
        }
        for(let j=i+1; j<=n; j++){
            if(cnt >= left && cnt <= right) answer.push(j)
            cnt++;
        }
    }
    return answer;
}

TC는 잘 통과했는데 채점에서 시간초과가 나버렸고
다른 방법이 뭐있지 하고 고민하면서 gif를 보면서 공책에 그림 그리다가

[0][0] 일 때, 1
[0][1] 일 때, 2
[0][2] 일 때, 3
[1][0] 일 때, 2
[1][1] 일 때, 2
[1][2] 일 때, 3
..
즉 해당 행렬 중 큰 숫자 보다 +1 큰 값인걸 알게되었다.
근데 또 인덱스는 별개더라..


인덱스는 x*n+y 라는걸 알아냈다.
즉, [1][2] 일때는 1*3+2 = 5번째 숫자
바꿔 말하면 i번째 숫자는 i/ni%n 중 큰 숫자 보다 +1인 값

function solution(n, left, right) {
    var answer = [];

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

    return answer;
}

i번째 숫자가 뭔지 바로 알수 있느니 for문도 1부터 할 필요가 없어졌다.
풀고나서 정답을 보니 다른 분과 완전히 똑같더라.

오우..

profile
멍청이

0개의 댓글