처음 내가 설계한 방법은 n값을 바탕으로 n * n의 배열을 만들어 그 안에 수를 모두 채워넣는것 이었다. 그 후, 1차원 배열로 다시 변환하여 left, right의 해당 인덱스만 answer에 값을 넣어주고 return 하는 방법이었다. 그러나 잘 작동하는 것 같지만 절반정도는 메모리초과로 실패가 떳다.
그 후, 설계할 때 생각해보니 각 배열의 좌표 x,y라 생각하였을 때, x와 y값 중 큰 값에 +1 한 값이 2차원 배열에 채워진다는 것이 생각났다. 그러면 위의 모든 작업을 할 필요없지 left부터 right까지 반복문 하나로 answer을 구할 수 있다는 생각이 들었다. 아래의 코드는 정답 코드이고 그 아래는 처음에 시도했던 코드이다.
public static int[] solution(int n, long left, long right) {
int[] answer = new int[(int) right - (int) left + 1];
int idx = 0;
for (long i = left; i <= right ; i++) {
answer[idx] = (int)Math.max(i / n, i % n) + 1;
idx++;
}
return answer;
아래의 코드는 메모리 초과가 뜬 처음 작성한 코드이다.
package Lv_2;
import java.util.Arrays;
public class n2배열자르기 {
public static int[] solution(int n, long left, long right) {
int[] answer = new int[(int)right - (int)left + 1];
int[][] tmp = new int[n][n];
// System.out.println(Arrays.deepToString(tmp));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
tmp[i][j] = i + 1;
}
if (i > j) {
tmp[i][j] = i + 1;
}
if (i < j) {
tmp[i][j] = j + 1;
}
}
}
// System.out.println(Arrays.deepToString(tmp));
int[] tmp2 = new int[n * n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
tmp2[i * n + j] = tmp[i][j];
}
}
System.out.println(Arrays.toString(tmp2));
int idx = 0;
for (long i = left; i < right + 1; i++) {
answer[idx] = tmp2[(int)i];
idx++;
}
return answer;
}
public static void main(String[] args) {
int n = 3;
long left = 2;
long right = 5;
int[] result = solution(n, left, right);
System.out.println(Arrays.toString(result));
}
}
'Java > Programmers' 카테고리의 다른 글
[Lv.2]귤 고르기 (0) | 2023.02.18 |
---|---|
[Lv.2]기능개발 (0) | 2023.02.17 |
[Lv.2]위장 (0) | 2023.02.14 |
[Lv.2]튜플 (0) | 2023.02.13 |
[Lv.2]행렬의 곱셈 (0) | 2023.02.12 |
댓글