코딩테스트 회고록/코테_Java

[JAVA] 프로그래머스 - n^2 배열 자르기 (1편)

iamjisu 2024. 3. 21. 22:56

프로그래머스 월간 코드 챌린지 시즌3  Lv.2  'n^2 배열 자르기' 문제 풀이와 풀이과정 입니다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명

정수 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 함수를 완성해주세요.

 

 

< 제한 사항 >

 


⚠️ 입출력 예시

입력 ▼

// n
3

// left
2

// right
5

 

출력 ▼

[3,2,2,3]

🔍 마주한 문제와 해결 과정

" 2차원 배열에 알맞은 숫자 주입하고 다시 1차원 배열로 재배치해서 잘라오면 되겠다! " 라고 정말 단순하게 생각했던 나를 반성하게 되었다.

// 정답이 아닌 코드 입니다!

import java.util.*;
class Solution {
    public int[] solution(int n, long left, long right) {
        int intLeft = (int)left;
        int intRight = (int)right;
        int[] answer = new int[intRight-intLeft+1];
        List<Integer> list = new ArrayList<>(2){};
        int[] array1 = new int[n*n];
        int[][] array2 = new int[n][n];
        
        int c = 1;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < c; j++) {
                array2[i][j] = c;
                list.add(array2[i][j]);
            }
            for(int j = c; j < n; j++) {
                array2[i][j] = j + 1;
                list.add(array2[i][j]);
            }
            c++;
        }
        
        for(int i = 0; i < list.size(); i++) {
            array1[i] = list.get(i);
        }
        
        for(int i = intLeft; i <= intRight; i++) {
            answer[i-intLeft] = array1[i];
        }
        
        return answer;
    }
}

▲ 테스트 케이스만 통과한 실패 코드ㅠ

 

 

그렇다.

결국 테스트 케이스 2개가 통과되어 기분 좋게 제출 버튼을 눌렀더니..

이러한 충격적인 결과가 나와버렸다..

 

메모리 신경 안 쓰고 자료구조 낭비에다 반복문 flex까지 해버린 나 자신. 이번 기회에 메모리를 아끼며 효율적인 코드를 짜는 것의 중요성을 알게 되었다.

 


🤔 급 마무리..?

결국,

메모리를 절약한 다른 규칙을 아직 찾지 못해 조금 더 시간을 투자해보기로 했다.

 

얼른 다른 규칙을 찾아 2편에서는 올바른 풀이과정을 올리겠습니다!!

오늘의 깨달음 포스팅 봐주셔서 감사합니다 :)