문제 설명
정수 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 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 107
- 0 ≤ left ≤ right < n2
- right - left < 105
입출력 예
n | left | right | result |
---|---|---|---|
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
입출력 예 #1
1. 1차시도
처음에는 HashMap 을 이용해서 만들어보았었다.
import java.util.*;
class Solution {
public int[] solution(int n, long left, long right) {
HashMap<Long, Integer> mapList = new HashMap<>();
long index = 0 ;
for (int i = 0;i < n; i ++) {
for (int j = 0; j < n; j ++){
if (i>j){
mapList.put(index++, i+1);
} else {
mapList.put(index++, j+1);
}
}
}
int[] arr = new int[(int) (right-left + 1)];
for (int i = 0; i < arr.length ; i++) {
arr[i] = mapList.get(left + i);
}
return arr;
}
}
- 테스트를 돌려보니 답은 잘 나왔다.
- 그렇지만, 메모리 초과가 뜨는 것 ..
- List를 만들어서 값을 접근하는 좋은 방법이 아닌 거 같다.
2. 2차 시도
- 이번에는 left right 만 주어지면 해당 리스트를 추론하여 얻는 방식을 채택했다.
몫 과 나머지로 적절하게 추론할 수 있었는데 아래의 그림을 보자 !
- 이런식으로 접근해주면 된다는 것이다 !
이거를 자바 코드로 작성하게 되면 아래와 같다.
import java.util.*;
class Solution {
public int[] solution(int n, long left, long right) {
int[] arr = new int[(int) (right-left+1)];
int index = 0;
for (long i = left; i <= right; i++) {
// 나머지는 실제 자리 값
int a = (int) (i % n);
// 몫은 반복수
int b = (int) (i / n);
arr[index] = Math.max(a+1, b+1);
index ++;
}
return arr;
}
}
'코딩 공부 > Programmers-Java' 카테고리의 다른 글
[programmers] 12919 서울에서 김서방 찾기 (1) | 2025.03.13 |
---|---|
[programmers] 134240 푸드 파이트 대회 (1) | 2025.03.12 |
[programmers] 12943 콜라츠 추측 (1) | 2025.03.10 |
[programmers] 12912 두 정수 사이의 합 (0) | 2025.03.10 |
[programmers] 12947 하샤드 (1) | 2025.03.10 |