n^2 배열 자르기

양동귀·2024년 7월 30일

자료구조

목록 보기
3/10
post-thumbnail

문제

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

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

풀이과정 생각

  • 2차원 배열을 만들고
  • 반복문 i, j 인덱스 값으로 [i][j] [j][i] 2차원 배열 완성
  • 각 줄 배열로 연결해서 1차원 배열로 만들어서 splice 로 시작(left), 끝(right) 인덱스 값으로 배열 잘라내서 값을 완성

2중 반복문 i>j (ex (3,0), (3,1), (3,2) 일때 => 3,3,3,(i=j = 3), j+1 ... (4, 5, 6,...) 으로 값을 1차원 배열에 쭉 나열해서 2x2 형태를 잘랐을때의 배열을 구함
left, right 인덱스 값만큼 잘라 낸다, sublist 를 쓴다면 right 부터 값이 없어지기때문에 답에 맞게 right + 1 부터 값 없애기

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

public class Solution {
       public int[] solution(int n, long left, long right) {
        int[] answer = {};
        ArrayList<Integer> dd = new ArrayList<>();
         for(int i = 0; i < n; i++){
             for(int j =0; j < n; j ++){
                 if(i>j){
                     dd.add(i+1);
                 }else{
                     dd.add(j+1);
                 }
             }
         }

         int leftInteger = (int) left;
         int rightInteger = (int) right + 1;
        List<Integer> ans =  dd.subList(leftInteger,rightInteger);
        answer = ans.stream().mapToInt(Integer :: intValue).toArray();
        

        return answer;
    }
}
import java.util.ArrayList;
import java.util.List;

class Solution {
       public int[] solution(int n, long left, long right) {
        int[] answer = new int [(int)(right-left +1)];

        int index = 0;

        int leftX = (int)left / n ;
        int leftY = (int)left % n ;

        int rightX = (int)right / n ;
        int rightY = (int)right % n ;

        for (int j = leftY; j < n; j++) {
            if (leftX > j) {
                answer[index] = leftX + 1;
            } else {
                answer[index] = j + 1;
            }
            index++;
        }

        for (int i = leftX + 1; i < rightX; i++) {
            for (int j = 0; j < n; j++) {
                if (i > j) {
                    answer[index] = i + 1;
                } else {
                    answer[index] = j + 1;
                }
                index++;
            }
        }

        for (int j = 0; j < rightY + 1; j++) {
            if (rightX > j) {
                answer[index] = rightX + 1;
            } else {
                rightX++;
                answer[index] = rightX;
            }
            index++;
        }
        
        return answer;
    }
}

풀이

n = 4

1 2 3 4
2 2 3 4
3 3 3 4
4 4 4 4

1  2  3  4 / 2  2  3  4  / 3  3  3  4 / 4  4  4  4
0  1  2  3   4  5  6  7    8  9  10 11  12 13 14 15 index
0  0  0  0   1  1  1  1    2  2  2  2   3  3  3  3  index/n
0  1  2  3   0  1  2  3    0  1  2  3   0  1  2  3  index%n

index/n, index%n 둘중 큰 값 + 1 의 배열 = 주어진 배열

left, right 나열했을때의 인덱스값
나누기 n을 했을때 같은 층에서는 모두 같은 값을 갖는다
나머지 n을 했을때 같은 층에서 0 ~ n-1 값을 갖는다
이 두 값이 같아지는 시점 이전 까지는 해당 층 + 1 의 값을 갖게 됨
그 이후 부터 +1 씩 늘어난다

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

public class Solution {
    public int[] solution(int n, long left, long right) {
        List<Integer> list = new ArrayList<>();

        for (long i = left; i <= right; i++) {
            int row = (int)(i / n);
            int col = (int)(i % n);
            list.add(Math.max(row, col) + 1);
        }

        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}

0개의 댓글