정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
다음은 해당 과정의 코드이다.
public class Solution {
public int[] solution(int n, long left, long right) {
long[] twoD = new long[n * n];
int[] answer = new int[(int) (right - left + 1)];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
twoD[i * n + j] = Math.max(i, j) + 1;
}
}
for (int i = 0; i < answer.length; i++) {
answer[i] = (int) twoD[(int) (left + i)];
}
return answer;
}
}
twoD
1차원 배열에 2차원 배열을 순서대로 넣으려고 했다.
1차원 배열의 인덱스= (행 × 행의 길이) + 열
위의 공식을 사용했다.
추가적으로 2차원 배열의 원소 중 큰 값으로 배열 값이 구성되고, 시작값이 1이기 때문에 그에 맞춰 구현했다.
위와 같은 순서로 배열에 적재를 했으나,
결과는 메모리 초과..
제한사항을 고려하면 어쩌면 당연한 결과였다.
그래서 2차원 배열을 직접 구현해서 배열에 담지 않고 해당 함수를 구현할 수 있는 로직만 구현하고 바로 정답을 도출하는 배열이 필요한 값만 메모리에 할당하는 방식으로 바꿨다.
public 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++) {
answer[index++] = (int) Math.max(i / n, i % n) + 1;
}
return answer;
}
}
2차원 배열을 1차원 배열로 펼치는 과정에서 각 인덱스를 행과 열로 변환할 때, 나눗셈과 나머지 연산을 사용한다.
1차원 배열의 인덱스 i
를 활용하면 2차원 배열의 (i / n, i % n)
를 구할 수 있다.