Programmers

[프로그래머스 Level.2] n^2 배열 자르기 (월간 코드 챌린지 시즌3) (Java)

Devtraces 2022. 12. 14. 02:55

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

코딩테스트 연습 > 월간 코드 챌린지 시즌3 > n^2 배열 자르기

 

 

 

문제 설명

 

 

정수 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

 


 

입출력 예
n left right result
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

 


 
입출력 예 설명

 

입출력 예 #1

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

 

 

 

입출력 예 #2

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

 

 

 

 

 

나의 코드

import java.util.*;

class Solution {
    
    public int[] solution(int n, long left, long right) {
        int[] answer = new int[(int) (right - left) + 1];
        int index = 0;
        
        while(left <= right) {
            answer[index++] = (int) Math.max(left / n, left % n) + 1;
            left++;
        }
        
        return answer;
    }
    
}

 

풀이

  1. n이 최대 10^7 이므로 2차원 배열을 만들어서 풀면 O(n^2)이 되어 실패한다.
  2. left와 right가 long 형이기 때문에 int형으로 변환해야 할 때 형변환 하는 것을 유의해야한다.
  3. 우선 answer는 left부터 right까지 이므로 answer의 크기는 right - left + 1이 된다.
  4. 그리고 while문을 돌면서 조건에 따라 answer에 수를 담아주면 된다.
  5. 문제에 주어진 조건에 따라 만든 행렬을 보면 행, 열 중에서 큰 index 값의 수가 해당 자리의 수가 된다.
  6. n*n 배열일 때, 행은 left / n + 1으로 열은 left % n + 1로 구할 수 있다. +1을 해주는 것은 index는 0부터 시작하므로 index + 1이 그 자리의 수가 되는 것이다.