프로그래머스(Java) n^2 배열 자르기
문제 이름:
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 중에 더 높은 값을 넣어준다.