Leetcode Java Diagonal Traverse II
업데이트:
문제
코드
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
int max = 0;
int length = 0;
List<Integer>[] map = new ArrayList[100001];
for (int i = 0; i < nums.size(); i++) {
List<Integer> list = nums.get(i);
int size = list.size();
length += size;
for (int j = 0; j < size; j++) {
int sum = i + j;
if (map[sum] == null) {
map[sum] = new ArrayList<>();
}
map[sum].add(list.get(j));
max = Math.max(max, sum);
}
}
int[] result = new int[length];
int index = 0;
for (int i = 0; i <= max; i++) {
List<Integer> curr = map[i];
for (int j = curr.size() - 1; j >= 0; j--) {
result[index++] = curr.get(j);
}
}
return result;
}
}
결과
설명
-
nums 내 값들을 2차원 배열 형태로 구성했을 때, 좌측 상단의 첫 값부터 좌측 아래에서 우측 위로 대각선 방향으로 이동했을 때 만나는 숫자 순서대로 정렬해서 하나의 배열로 만드는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- max는 nums를 이용하여 만들 수 있는 대각선의 갯수로, 0으로 초기화한다.
- length는 nums 내 값들의 수를 저장할 변수로, 0으로 초기화한다.
- map은 대각선대로 값을 이어줄 변수로, 값의 가장 큰 갯수보다 1 큰 100001 크기의 ArrayList 배열로 초기화한다.
- 위의 값들을 nums를 반복하여 max에 nums의 대각선의 갯수를, length에 nums 내 값들의 수를, map에 $i + j$인 각 대각선 순서대로 첫 행부터 마지막 행까지 값들을 넣어준다.
- result는 숫자들을 순서대로 넣어 줄 배열로, length 길이의 정수 배열로 초기화한다.
- index는 result의 각 위치를 순서대로 넣기 위한 변수로, 첫 위치인 0으로 초기화한다.
- map을 첫 배열의 List부터 순차적으로 반복하여 역순으로, result에 값을 넣어 주어진 문제의 결과로 반환한다.
해설
- 숫자의 대각선 순서대로 저장할 map을 List의 배열로 초기화한 이유는 각 위치는 i번째 행과 j번째 행을 더한 위치가 아래와 같이 순차적으로 계산이 가능하므로 이를 활용한다.
- 첫 번째 대각선 : $0 + 0 = 0$
- 두 번째 대각선 : $0 + 1 = 1 + 0 = 1$
- 세 번쨰 대각선 : $0 + 2 = 1 + 1 = 2 + 0 = 2$
- nums 내 각 List의 값들은 동일하지 않은 길이의 정수 값으로 이루어졌으므로, map에 값이 들어간 List의 수는 map개가 존재하고 result의 길이는 length로 초기화하기 위해 두 값을 계산한다.
- map의 각 List는 첫 행부터 마지막 행 순으로 각 배열에 값을 넣었으므로, 대각선대로 역순으로 result에 값을 넣는다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기