Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 2차원 이진 행렬 가로 뒤집기 및 반전하기

문제 소개

이번 글에서는 0과 1로만 구성된 2차원 이진 배열(arr)을 첫 번째이자 유일한 인수로 받아, 행렬을 먼저 가로로 뒤집고(horizontal flip), 그다음 반전(invert)한 결과를 반환하는 JavaScript 함수를 작성해 보겠습니다.

가로 뒤집기란?

행렬을 가로로 뒤집는다는 것은 각 행의 요소 순서를 거꾸로 바꾸는 것을 의미합니다. 예를 들어 [1, 1, 0]을 가로로 뒤집으면 [0, 1, 1]이 됩니다.

반전이란?

행렬을 반전한다는 것은 모든 0을 1로, 모든 1을 0으로 바꾸는 것입니다. 예를 들어 [0, 1, 1]을 반전하면 [1, 0, 0]이 됩니다.

입력 및 출력 예시

함수에 다음과 같은 입력이 주어졌다고 가정해 보겠습니다.

입력

const arr = [
    [1, 1, 0],
    [1, 0, 1],
    [0, 0, 0]
];

출력

const output = [
    [1,0,0],
    [0,1,0],
    [1,1,1]
];

출력 과정 설명

먼저 각 행을 역순으로 뒤집습니다.

[[0,1,1],[1,0,1],[0,0,0]]

그다음 행렬 전체를 반전하면 최종 결과가 완성됩니다.

[[1,0,0],[0,1,0],[1,1,1]]

구현 코드

다음은 위 문제를 해결하는 전체 코드입니다.

const arr = [
    [1, 1, 0],
    [1, 0, 1],
    [0, 0, 0]
];
const flipAndInvert = (arr = []) => {
    const invert = n => (n === 1 ? 0 : 1)
    for(let i = 0; i < arr.length; i++) {
       for(let j = 0; j < arr[i].length / 2; j++) {
          const index2 = arr[i].length - 1 - j
          if(j === index2) {
             arr[i][j] = invert(arr[i][j])
          } else {
             const temp = arr[i][j]
             arr[i][j] = arr[i][index2]
             arr[i][index2] = temp
             arr[i][j] = invert(arr[i][j])
             arr[i][index2] = invert(arr[i][index2])
          }
       }
    }
};
flipAndInvert(arr);
console.log(arr);

코드 동작 원리

이 코드는 투 포인터(two pointer) 기법을 활용해 추가 배열 없이 제자리(in-place)에서 연산을 수행합니다. 각 행의 양쪽 끝 요소부터 시작해 중앙으로 이동하면서 두 요소를 서로 교환(swap)하고, 동시에 invert 함수를 호출해 값을 반전시킵니다.

행의 길이가 홀수인 경우, j와 index2가 같아지는 중앙 지점에서는 교환 없이 해당 요소만 반전하도록 처리했습니다. 이렇게 하면 한 번의 순회로 뒤집기와 반전을 모두 완료할 수 있어 시간 복잡도는 O(n×m), 공간 복잡도는 O(1)입니다.

실행 결과

[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 1, 1, 1 ] ]