반응형
1. 문제
- 그림과 같이 사각형이 주어질 때, 대각선으로 탐색하면서 요소들을 순서대로 배열에 담아 반환하라.
2. 해결
function findDiagonalOrder(mat: number[][]): number[] {
let i =0, j =0; // i, j 인덱스
let isUp = true; // 위 또는 아래 방향
const result = [] // 결과 배열
// i와 j가 마지막 인덱스에 도달할 때 까지 반복.
while(i <= mat.length -1 && j <= mat[i].length -1 ){
result.push(mat[i][j]); // 요소 삽입.
if(isUp) { // 위로 올라가는 경우면,
if(i === 0 || j === mat[i].length -1) { // i가 0 또는 j가 마지막 인덱스일 때,
isUp = false; // 방향 전환.
} else { // 그 외는 i가 감소.
i--;
}
if(j < mat[i].length -1) // j는 기본적으로 증가하지만, 범위를 넘지 않도록.
j++;
else i++; // j가 증가할 수 없는 경우 === 맨 오른쪽에 도달 => i를 증가 시켜 밑으로 내린다.
} else if(!isUp) { // 내려가는 경우면,
if(j === 0 || i === mat.length -1) { // j가 0 또는 i가 마지막 인덱스일 때,
isUp = true; // 방향 전환.
} else { // 그 외는 j가 감소.
j--;
}
if(i < mat.length -1) // i는 기본적으로 증가하지만, 범위를 넘지 않도록.
i++;
else j++; // i가 증가할 수 없는 경우 === 맨 밑에 도달 => j를 증가 시켜 오른쪽으로 이동.
}
}
return result
};
- 리팩토링을 하지 않아서 좀 복잡해 보일 수 있는데, 핵심 요점은 아래와 같다.
- 우상향: i는 감소, j는 증가.
- 좌하향: i는 증가, j는 감소.
- 증감 과정에서 범위가 넘는 지 확인.