PROGRAMMERS/챌린지
[프로그래머스] [JAVA] [Level 2] [월간 코드 챌린지 시즌3] n^2 배열 자르기
c0mmedes
2022. 10. 1. 02:14
1. (메모리 초과)
import java.util.*;
class Solution {
public int[] solution(int n, long left, long right) {
// 1, 2
int ar[][] = new int[n][n];
for(int i=0; i<ar.length; i++){
for(int j=0; j<ar[0].length; j++){
ar[i][j] = Math.max(i,j) +1;
}
}
// 3
ArrayList<Integer> alist = new ArrayList<>();
for(int i=0; i<ar.length; i++){
for(int j=0; j<ar[0].length; j++){
alist.add(ar[i][j]);
}
}
int intleft = Long.valueOf(left).intValue();
int intright = Long.valueOf(right).intValue();
int[] answer = new int[intright-intleft+1];
// 4
for(int i=0; i<answer.length; i++){
answer[i] = alist.get(intleft+i);
}
return answer;
}
}
- 이차원 배열 만들어서 풀기 위해서는 제한사항(10^7 * 10^7)을 돌아서 배열을 만드는 경우가 있다.
- 그래서 메모리 초과에 걸린 듯하다.
2.
위의 1번코드에서 보았을 때 2차원에 배열에 (행, 열) 에서의 max값을 뽑아서 +1 한값으로 초기화하는 방식을 사용했다.
그 방식을 이용하면 된다.
ex) 2행 3열(2차원 배열에서 [1][2]) 은 1 과 2중에서 max값을 뽑아서 +1을 하면 3이다.
이 문제를 풀기위해서는 두가지를 알아내야 한다.
1. n을 이용해서 구하려는 순서의 행과 열을 알아내기
2. 알아낸 행과 열에 초기화되는 값 알아내기
public class Solution {
public int[] solution(int n, long left, long right) {
int len = (int) right - (int) left;
int[] answer = new int[len + 1];
int idx = 0;
for (long i = left; i <= right; i++) {
// 1
long row = i / n;
long col = i % n;
// 2
answer[idx++] = Math.max((int)row, (int)col) + 1;
}
return answer;
}
}