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;
    }
}

참조 https://seongho96.tistory.com/59