본문 바로가기
Java/Programmers

[Lv.2]n^2 배열 자르기

by GLOWWW 2023. 2. 15.


처음 내가 설계한 방법은 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

댓글