n^2 배열 자르기

심규원·2024년 8월 21일

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

import java.util.*;
import static java.lang.Math.*;
class Solution {
    public int[] solution(int n, long left, long right) {
        int[] answer = {};
        
        LinkedList<Long> ll = new LinkedList<>();
        for(long i = left; i <= right; i++){
            long temp;
            long tempA = i / n;
            long tempB = i % n;
            long tempC = 0;
            tempC = max(tempA, tempB);
            temp = tempC + 1;


            ll.add(temp);
        }
        
        int[] arr = new int[ll.size()];
        for(int i = 0; i < ll.size(); i++) arr[i] = ll.get(i).intValue();
        
        return arr;
    }
}

날것그대로의 코드.

핵심 규칙인 max(i / n, i % n) + 1 을 깨닫는데 참으로 오래걸렸다.
하지만 스스로 깨달았다는것에 만족스럽다. 그 과정역시 오래걸렸을지언정 매끈한 편이었고.

속도는 역겨울 정도로 느리다.

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<Integer> solution(int n, long left, long right) {
        List<Integer> answer = new ArrayList<>();
        
        for (long i = left; i <= right; i++) {
            int row = (int) (i / n);
            int col = (int) (i % n);
            answer.add(Math.max(row, col) + 1);
        }
        
        return answer;
    }
}

GPT 의 답안과 비교해보자.
굉장히 정석적인 답처럼 보이지만 반환값이 List 로 기존의 int[] 형이 아니다. 즉 자신이 조작했다는 것.

For 문으로 다시 돌면서 배열을 만들필요가 없으므로 그 시간이 단축되고 상당한 효과를 얻는다.

  import java.util.*;
import static java.lang.Math.*;
class Solution {
    public LinkedList<Long> solution(int n, long left, long right) {
        
        LinkedList<Long> ll = new LinkedList<>();
        for(long i = left; i <= right; i++){
            long temp;
            long tempA = i / n;
            long tempB = i % n;
            long tempC = 0;
            tempC = max(tempA, tempB);
            temp = tempC + 1;


            ll.add(temp);
        }

        
        return ll;
    }
}

내 코드 역시 반환값을 조작했을 때 상당한 속도의 상승을 얻을수있었다.

예전까지는 반환값을 직접 조작하는것에 부정적이었는데 이 정도 속도차이면 해야겠다...

0개의 댓글