정수 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;
}
}
