[level 2] n^2 배열 자르기 - 87390

2024. 9. 15. 17:09·코딩테스트/프로그래머스

[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차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 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차원 배열을 만드는 과정을 나타낸 것입니다.

ex1

입출력 예 #2

  • 다음 애니메이션은 주어진 과정대로 1차원 배열을 만드는 과정을 나타낸 것입니다.

ex2

기존에 생각했던 해결 방법

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 배열에 저장 

 

문제점

기존 해결 방법 채점 결과

  1. 시간 복잡도
    • 2차원 배열 생성 : O(n^2) 3중 반복문을 사용하여 n * n 크기의 2차원 배열을 채우고 있음. 이는 O(n^3)의 시간 복잡도를 가짐
  2. 공간 복잡도
    • 2차원 배열 : O(n^2) n * n 크기의 2차원 배열을 메모리에 저장
  3. 효율성 문제
    • 불필요한 계산 : 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
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [level 2] 2 x n 타일링 - 12900
  • [level 2] [1차] 캐시 - 17680
  • [level 2] 할인 행사 - 131127
  • [level 2] 연속 부분 수열 합의 개수 - 131701
mint723dev
mint723dev
mint723dev 님의 블로그 입니다.
  • mint723dev
    mint723dev 님의 블로그
    mint723dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (90)
      • Computer Science (16)
        • Computer Architecture (0)
        • Data Structure (2)
        • Database (4)
        • Network (4)
        • Operating System (6)
        • Software Engineering (0)
      • Java (6)
      • 자료 구조 (0)
      • 코딩테스트 (64)
        • LeetCode (1)
        • 프로그래머스 (29)
        • 백준 (34)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    DP
    JVM
    DFS
    BFS
    deque
    탐욕법
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
mint723dev
[level 2] n^2 배열 자르기 - 87390
상단으로

티스토리툴바