알고리즘 문제 풀이 - n^2 배열 자르기

공부중인 개발자·2021년 10월 21일
0

알고리즘

목록 보기
55/63
post-thumbnail
post-custom-banner

https://programmers.co.kr/learn/courses/30/lessons/87390

n^2 배열 자르기

문제 설명

정수 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 함수를 완성해주세요.

제한사항

1 ≤ n ≤ 10^7
0 ≤ left ≤ right < n^2
right - left < 10^5

입출력 예

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

문제 풀이

function solution(n, left, right) {
    var answer = [];
    for (let i = left; i<=right; i++) {
        let a = parseInt(i/n);
        let b = i%n
        if(a<=b) answer.push(b+1)
        else {
            answer.push(a+1)
        }
    }
    return answer;
}

처음엔 제한사항을 유념히 보지 못해 이중 반복문을 돌렸지만 테스트에서 문제가 생긴것을 확인하고
더 효율적으로 코드를 짜기위한 방법을 구현하고자 했다.

  1. 2차원 배열의 규칙을 파악해서 1차원 배열로 만들어주기
  2. 1차원 배열에서 필요한 left부터 right까지 구해주기

먼저 1차원배열로 만들어진 것을 구현하기 위해 규칙을 찾아봤다. 규칙은

n이 4 일때
1,2,3,4
2,2,3,4
3,3,3,4
4,4,4,4

이렇게 늘어가기 때문에 n씩 끊어지는 규칙을 찾았고
0번째 인덱스 일 때(2차원 배열의)는 1,2,3,4 1번째 인덱스는 2,2,3,4 x번째 인덱스 전까지의 숫자는 x번째 인덱스의 숫자와 같다는 것을 파악했다.

let a = parseInt(i/n) 변수 a가 2차원 배열의 인덱스이고 b는 2차원 배열 안의 인덱스이다. 그래서 b번째 인덱스까지는 a+1 를 넣어주고 그 외의 숫자는 b+1을 해서 답을 냈다.

profile
열심히 공부하자
post-custom-banner

0개의 댓글