https://school.programmers.co.kr/learn/courses/30/lessons/87390
문제 설명
정수 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 함수를 완성해주세요.
(풀이코드)
class Solution {
public int[] solution(int n, long left, long right) {
int li = (int)(left/n),lj = (int)(left%n);
int A = (int)(right-left);
int[] answer = new int[A+1];
int a= 0;
for(int i = 0; i<=A; i++) {
answer[a++]= (li>lj?li:lj)+1;
lj++;
if(lj==n) {
lj=0;li++;
}
}
return answer;
}
}
(코드설명)
//
1. 먼저 n행n열 크기의 비어 있는 2차원 배열의 경우 행과 열 중 큰 값에 +1을 한 값을 넣은 게 배열에 들어간 값이다.
이걸 이용해서 left~ right까지의 배열을 만든다면,
우선 이 배열 answer의 크기는 right-left +1 이 배열의 크기가 된다. 이걸 A로 선언해주었다.
그리고 이 left의 값들이 무슨행 무슨열인지 알 기 위하여 left를 n으로 나눈 값이 행이 되고, n으로 나눈 나머지가 열이된다.
이걸 이용하면
answer[] 에 A개(right-left+1) 의 값을 순차적으로 넣으면 된다. N으로 나누는 방식으로 비교를 해도 됬지만, 그냉 li 와 lj로 나눈 다음에 A개수로 돌도록 하였다.
// 시행착오
처음에 행렬을 만들고 그 안에 N*N의 값을 모두 넣은다음에 하니까 메모리 초과가 났다.
그래서 다시 보니 규칙적으로 배열이 선언되어 있었기 떄문에 배열을 선언하지 않고 가능하였고, 이를 통해 풀 수 있었다.
(효율성첨부)