-
[프로그래머스/JAVA] n^2 배열 자르기Algorithm/Java 2025. 1. 23. 10:18
https://school.programmers.co.kr/learn/courses/30/lessons/87390
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[ 오답 노트 ]
❌ 기존 오답 코드class Solution { public int[] solution(int n, long left, long right) { int[] answer = new int[right - left + 1]; // 1. n행 n열 크기의 2차원 배열 만들기 // n = 3 (3행 3열)일때, // 1 2 3 // 2 2 3 // 3 3 3 // 2. 1행, 2행,... n행 잘라내어 모두 이어붙인 새로운 1차원 배열 만들기 // 1 2 3 / 2 2 3 / 3 3 3 // 3. arr[left], arr[left+1]...arr[right]만 남기고 나머지 지우기 // arr[2], arr[3], arr[4], arr[5]일때, // 답은 [3,2,2,3] //----------------------- // 1. n행 n열 크기의 2차원 배열 만들기 // [[1,2,3], [2,2,3], [3,3,3]] // i j = 0 1 2 // 0 i+1, i+2, i+3, // 1 i+2, i+2, i+3, // 2 i+3, i+3, i+3 // [0,0] = 1 // [0,1], [1,0], [1,1] = 2 // [0,2], [1,2], [2,0],[2,1],[2,2] = 3 int arr[][] = new int[n][n]; for(int i = 0; i < n; i++) { for(int j = i; j < n; j++) { if(i >= j) { arr[i][j] = i+1; }else if(i <= j) { arr[i][j] = j+1; }// [[1,2,3], [2,2,3], [3,3,3]] // -> [1,2,3,2,2,3,3,3,3]으로 1차원 배열로 바꾸기 int arr2[] = new int[n*n]; for(int z = 0; z < n*n; z++) { arr2[z] = arr[i][j]; } // 2.arr2[left], arr2[left+1]...arr2[right]만 남기고 나머지 지우기 // arr2[2], arr2[3], arr2[4], arr2[5] for(int t = left; t < right; t++) { answer[t] = arr2[t]; } } } return answer; } }
📌 기존 코드의 문제점
1. 이중배열 생성(arr[][])과 불필요한 메모리 사용 문제
- 문제 조건 제한 사항에서 n은 최대 10^7까지 가능하므로 n x n 크기의 배열을 생성하면 메모리 초과가 발생한다.
- 따라서, 기존 코드의 2차원 방식이 아닌 1차원 배열로 직접 접근하는 방법을 사용해야 한다.
2. 1차원 배열(arr2[]) 변환 문제
- z의 값에 따라 arr[i][j]의 위치를 결정하지 않고, arr[i][j]의 동일한 값을 arr2[]의 모든 인덱스에 덮어쓰고 있기 때문에 정확하지 않는 값이 들어가게 된다.
3. 잘라내기 구현(answer[t] = arr2[t];)문제
- answer 인덱스는 0부터 시작해야하지만, 기존 코드에서는 t에 맞춰서 left값 부터 인덱스가 시작하므로 잘못되었다.
[ 정답 코드 & 올바른 풀이 ]
📌 정답 코드class Solution { public int[] solution(int n, long left, long right) { int[] answer = new int[(int)(right - left + 1)]; // 메모리 초과를 막기 위해 2차원 배열이 아닌 // 처음부터 1차원 배열로 정답 배열 채우기! [1,2,3,2,2,3,3,3,3] for(long i = left; i <= right; i++) { // 2~5 // 행 열 = 0 1 2 // 0 i+1, i+2, i+3, // 1 i+2, i+2, i+3, // 2 i+3, i+3, i+3 // [0,0] = 1 // [0,1], [1,0], [1,1] = 2 // [0,2], [1,2], [2,0],[2,1],[2,2] = 3 // [행,열] 형식인데 열과 행 중 큰 수가 채울 숫자가 된다. // [0,2], [0,1], [1,0], [2,1] int row = (int)(i / n); //2 / 3 = 0 int col = (int)(i % n); //2 % 3 = 2 // answer 인덱스는 0부터 채워져야 함 answer[(int)(i - left)] = Math.max(row, col)+1; } // [3,2,2,3] return answer; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] H-Index (0) 2025.01.24 [프로그래머스/JAVA] 행렬의 곱셈 (0) 2025.01.23 [프로그래머스/JAVA] 할인행사 (1) 2025.01.22 [프로그래머스/JAVA] 괄호 회전하기 (0) 2024.12.01 [프로그래머스/JAVA] 연속 부분 수열 합의 개수 (0) 2024.12.01