[level 2] n^2 배열 자르기 - 87390
성능 요약
메모리: 91.8 MB, 시간: 6.77 ms
구분
코딩테스트 연습 > 월간 코드 챌린지 시즌3
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2024년 09월 15일 16:46:48
문제 설명
정수 n
, left
, right
가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n
행n
열 크기의 비어있는 2차원 배열을 만듭니다.i = 1, 2, 3, ..., n
에 대해서, 다음 과정을 반복합니다.- 1행 1열부터
i
행i
열까지의 영역 내의 모든 빈 칸을 숫자i
로 채웁니다.
- 1행 1열부터
- 1행, 2행, ...,
n
행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. - 새로운 1차원 배열을
arr
이라 할 때,arr[left]
,arr[left+1]
, ...,arr[right]
만 남기고 나머지는 지웁니다.
정수 n
, left
, right
가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤
n
≤ 107 - 0 ≤
left
≤right
< n2 right
-left
< 105
입출력 예
n | left | right | result |
---|---|---|---|
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
입출력 예 설명
입출력 예 #1
- 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.
입출력 예 #2
- 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.
기존에 생각했던 해결 방법
import java.util.*;
class Solution {
public int[] solution(int n, long left, long right) {
int[][] arrs = new int[n][n];
for(int i=arrs.length - 1; i>=0; i--){
for(int j=0; j<=i; j++){
for(int k=0; k<=j; k++){
arrs[k][j] = i+1;
}
arrs[i][j] = i+1;
}
}
int[] answer = new int[(int)(right-left+1L)];
for (long i = left; i<=right; i++){
answer[(int)(i-left)] = arrs[(int)(i/n)][(int)(i%n)];
}
return answer;
}
}
문제 설명에 따라 실제 2차원 배열을 생성 후, 배열을 통해 값을 가져와 answer 배열에 저장
문제점
- 시간 복잡도
- 2차원 배열 생성 : O(n^2) 3중 반복문을 사용하여 n * n 크기의 2차원 배열을 채우고 있음. 이는 O(n^3)의 시간 복잡도를 가짐
- 공간 복잡도
- 2차원 배열 : O(n^2) n * n 크기의 2차원 배열을 메모리에 저장
- 효율성 문제
- 불필요한 계산 : left와 right 사이의 값만 필요함에도 전체 n * n 배열을 생성
- 중복 계산 : 3중 반복문에서 같은 값을 여러 번 할당
- 메모리 낭비 : 대부분의 경우 n * n 배열 전체가 필요하지 않음
해결 방법
배열을 생성하지 않고도 각 위치의 값을 Math.max(row, col) + 1로 계산할 수 있음
따라서 코드를 다음과 같이 개선
class Solution {
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int)(right-left+1L)];
// x,y 좌표값 중 큰 값 + 1
for (long i = left; i<=right; i++){
answer[(int)(i-left)] = Math.max((int)(i/n),(int)(i%n))+1;
}
return answer;
}
}
배열을 생성하지 않고 값의 규칙을 통해 계산하여 시간 복잡도, 공간 복잡도 문제를 해결
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[level 2] 2 x n 타일링 - 12900 (0) | 2024.09.22 |
---|---|
[level 2] [1차] 캐시 - 17680 (3) | 2024.09.20 |
[level 2] 할인 행사 - 131127 (1) | 2024.09.15 |
[level 2] 연속 부분 수열 합의 개수 - 131701 (1) | 2024.09.14 |
[level 2] 구명보트 - 42885 (0) | 2024.09.14 |