정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
입출력 예 #1
입출력 예 #2
2023.04.11
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int) (right - left + 1)];
//빈 배열 만들기
int[] temp = new int[n*n];
//각 배열의 숫자를 넣어주기 위해서
int cnt = n;
//숫자 넣기
for (int i = 0; i < n; i++) {
//n = 3일 경우, [1, 0, 2, 2, 0, 3, 3, 3] 이런식으로 숫자를 넣어주는 반복문
for (int j = i * n; j <= (i * n) + i; j++) {
temp[j] = i + 1;
}
//n = 3일 경우, [1, 2, 2, 2, 3, 3, 3, 3] 빈 곳에 각 숫자를 넣어주는 반복문
for (int j = n; j <= (i * n); j += n) {
temp[j - cnt] = i + 1;
}
//배열의 자리를 맞추기 위해서
cnt--;
}
int num = (int) left;
//left부터 right 까지의 배열을 가져오기
for (int i = 0; i < answer.length; i++) {
answer[i] = temp[num];
num++;
}
return answer;
}
런타임 에러와 메모리 초과 발생
예를 들어서 n = 3일 경우,
(1, 1) (1, 2) (1, 3)
(2, 1) (2, 2) (2, 3)
(3, 1) (3, 2) (3, 3)
라고 가정 하였을 때, 앞에 Math.max 를 사용하면 둘 중 더 높은 값을 값으로 가지게 된다.
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int) (right - left + 1)];
//문제를 좌표 개념으로 생각하고 풀기
for (int i = 0; i < answer.length; i++) {
int x = (int) (left / n + 1);
int y = (int) (left % n + 1);
left++;
answer[i] = Math.max(x, y);
}
return answer;
}
통과