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