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

알재·2024년 7월 3일
0

코딩 테스트

목록 보기
40/57
post-custom-banner

링크

문제링크

문제

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

입출력

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

해결

배열을 만드는 패턴이 1차원 배열처럼 나열했을때 원소의 패턴은

1, 2, 3 ... n / 2, 2, 3 ... n / 3, 3, 3, 4 ... n /...

이렇게 진행하게 된다.
처음 원소들의 패턴이 k번째 행일때 k가 k번 출력되고 다음에 n까지 증가하면서 채워진다.
left 에서부터 right까지 원소를 계산하여 각 원소를 arr에 채운다.
startRow,endRow 로 순회할 행을 구해준다.

startIdx는 반복시 몇 번째 원소부터 시작하는지 구한다.
startRow 행이 아니라면 인덱스 0부터 시작할것이고 startRow일때는 left % n 인덱스부터 시작할 것이다.
endRow도 비슷한 이치로 구할 수 있다.

arr에 원소를 채울 때 현재 열 j가 i보다 작을 시 i+1 값을 아닐시 j+1값을 준다.

코드

class Solution {
    public int[] solution(int n, long left, long right) {
        int[] answer = {};
        
        int answerLength = (int) right + 1 - (int) left;
        int[] arr = new int[answerLength];
        int idx = 0;

        int startRow = (int) (left / n);
        int endRow = (int) (right / n);

        for (int i = startRow; i <= endRow; i++) {

            int startIdx = startRow < i ? 0 : (int) (left % n);
            int endIdx = endRow == i ? (int) (right % n) + 1 : n;

            for (int j = startIdx; j < endIdx; j++) {
                arr[idx++] = j < i ? i + 1 : j + 1;
            }
        }

        answer = arr;
        return answer;
    }
}
profile
저장소
post-custom-banner

0개의 댓글