프로그래머스 문제

프로그래머스(Java) n^2 배열 자르기

정리제이 2024. 8. 21. 09:39

문제 이름:

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 함수를 완성해 주세요.

 

처음 작성한 코드:

더보기
import java.util.*;

class Solution {
    public int[] solution(int n, long left, long right) {
        int[] answer = {};
        
        int[][] arr = new int[n][n]; 
        List<Integer> list = new ArrayList<>(); 
        
       
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                arr[i][j] = Math.max(i + 1, j + 1);
            }
        }
      
        
        for(int[] row : arr){
            for(int value : row){
                list.add(value);
            }
        }
        
        
        List<Integer> subList = list.subList((int)left, (int)right + 1);
        
        
        answer = subList.stream().mapToInt(i -> i).toArray();
        
        return answer;
    }
}

 

이 코드는 제출을 했을 때 2차원 배열을 만들어서 사용을 했더니 메모리 초과가 떠서 실패한 코드이다.

 

 

다시 작성한 코드:

더보기
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;
        for (long i = left; i <= right; i++) {
            int row = (int)(i / n);
            int col = (int)(i % n);
            answer[index++] = Math.max(row + 1, col + 1);
        }
        
        return answer;
    }
}

 

입, 출력 예시를 보니 left~ right까지의 길이를 가진 배열이 출력이 되어있었다.

 

그래서 answer의 크기를 rigth - left + 1로 지정을 해준다.(Ex.. left = 2, right = 5 >> 5 - 2 + 1 = 4 )

 (n = 3)

[2차원 배열]

1 2 3

2 2 3

3 3 3

 

2차원 배열을 만들었을 때 나온 값들 중 left ~ right까지의 값을 넣어줘야 하니

반복문은 left ~ right까지 돌리고 행과 열을 구하기 위해

i / n = 행, i % n = 열 로 계산을 해준다.

 

answer의 각 값에 행 + 1, 열 + 1 중에 더 높은 값을 넣어준다.