-
[알고리즘] 배열의 행과 열 바꾸기알고리즘 2021. 10. 4. 19:30728x90
배열의 행과 열 바꾸기
배열을 다루는 여러 가지 방식 중 행과 열 바꾸는 방식에 대해 알아보자.
일반적인 방법
- 원본이 변경되지 않기 위해 임시 배열을 만든다.
- 배열을 횡으로 순환하면서 값을 넣어준다.
let matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; // 첫번째 방법 반복문을 돌면서 바꿔준다 let ansMatrix = []; // 1. 배열의 행 길이만큼 반복한다 for( let i = 0; i < matrix[0].length ; i++){ const tmp = []; // 2. 배열의 행에서 선택한 열의 값을 추출 matrix.forEach( (row, idx) => tmp.push(row[i])); // 3. 추출한 값을 저장 ansMatrix.push(tmp); } console.log(ansMatrix);
실행결과
[ [1, 4, 7] [2, 5, 8] [3, 6, 9]]
시간 복잡도
O(n * n)의 시간 복잡도를 갖습니다. 배열의 열 길이만큼 O(n), 행을 이중으로 반복 O(n) 하기 때문에 O(n^2)의 시간 복잡도를 갖는다.
소스 분석
- 소스의 통일감이 조금 아쉽다. for문과 forEach문이 같이 있는 건 큰 문제가 되진 않지만, 가능하면 하나만 사용해서 가독성 있는 코드를 작성하자.
- matrix의 값을 보장하기 위해서 ansMatrix를 선언하여 구현한 부분은 좋다. 하지만 ansMatrix 값은?? 외부에 선언되어 있기에, 값의 안정성을 보장하지 않는다. 즉 언제든 외부에서 변경이 가능하게 된다. 또한 따로 ansMatrix를 구현하지 않고 구현한다면 메모리적으로도 훨씬 좋을 것이다. 최소한의 변수를 선언하여 구현하자.
소스 개선
let matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; console.log( // 1. 배열의 행 길이만큼 반복한다 matrix.map( (_, idx) => // 2. 배열의 행에서 선택한 열의 값을 추출 후 반환 matrix.map( row => row[idx])) );
단 한 줄의 코드로 배열의 행과 열을 변경할 수 있다.
배열 내장 함수만을 이용하여 구현했으므로 훨씬 일관성 있는 코드가 됐다.
소스 코드의 길이도 이전 소스보다 절반 이상 줄었다.
정리 및 느낀 점
좋은 코드는 많은 고민 끝에 나온다. 내장 함수를 어떻게 잘 활용할 수 있을지 고민해보는 것뿐 아니라 많이 사용해봄으로써 나의 몸값을 키워나가야 함을 느꼈다.
728x90'알고리즘' 카테고리의 다른 글
[알고리즘] BFS 그래프 탐색 (0) 2024.02.28 [알고리즘] 순열 (2) 2024.01.27 [그림으로 이해하는 알고리즘] (0) 2019.05.18