나는 컴공이다!/웹

[JavaScript] 2차원 배열 깊은 복사

택 오버플로우 닷컴 2025. 10. 25. 22:11
 

[자바스크립트] 2차원 배열 깊은 복사 하기

자바스크립트를 사용하다가 2차원 배열을 깊은 복사해야할 상황이 올 수도 있다. 아래처럼 우리가 아는대로 진행하면 원본 배열의 값이 계속 바뀌는 걸 확인할 수 있다. let arr1 = [[1,2,3],[2,3,4]] let

parkparkpark.tistory.com

챗 지피티에 물어봤다가 못믿겠어서 작접 구글링해보니 위 링크의 글을 보게 되었다.

아하... 필자가 사용한 방식은 1차원 배열에서는 깊은 복사가 될 지 언정 2차원배열에서도 깊은복사를 하기 위해서는 저렇게 Map을 돌리든 어찌하든 각각 한번씩 더 해줘야 하는구나.

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

위 코딩테스트 문제를 풀다가 처음 작성한 오류코드이다.

function solution(board) {
    var answer = 0;
    let mineBoard = [...board];
    
    for(let i=0; i<board.length; i++){
        for(let j=0; j<board[i].length; j++){
            if(board[i][j] === 1){
                mineBoard[correct(i-1,board.length)][correct(j-1,board[i].length)] = 1;
                mineBoard[correct(i-1,board.length)][correct(j,board[i].length)] = 1;
                mineBoard[correct(i-1,board.length)][correct(j+1,board[i].length)] = 1;
                mineBoard[correct(i,board.length)][correct(j-1,board[i].length)] = 1;
                mineBoard[correct(i,board.length)][correct(j,board[i].length)] = 1;
                mineBoard[correct(i,board.length)][correct(j+1,board[i].length)] = 1;
                mineBoard[correct(i+1,board.length)][correct(j-1,board[i].length)] = 1;
                mineBoard[correct(i+1,board.length)][correct(j,board[i].length)] = 1;
                mineBoard[correct(i+1,board.length)][correct(j+1,board[i].length)] = 1;
            }
        }
    }
    
    return answer;
}

function correct(i, len){
    let result = i;
    
    if(i<0){
        result = 0;
    }else if(i>=len){
        result = len - 1;
    }
    
    return result;
}

 

아래는 오류를 수정한 코드이다. Map을 통해 루프를 돌면서 각각 깊은 복사를 해주었다.

function solution(board) {
    var answer = 0;
    let mineBoard = board.map(v => [...v]);
    
    for(let i=0; i<board.length; i++){
        for(let j=0; j<board[i].length; j++){
            if(board[i][j] === 1){
                mineBoard[correct(i-1,board.length)][correct(j-1,board[i].length)] = 1;
                mineBoard[correct(i-1,board.length)][correct(j,board[i].length)] = 1;
                mineBoard[correct(i-1,board.length)][correct(j+1,board[i].length)] = 1;
                mineBoard[correct(i,board.length)][correct(j-1,board[i].length)] = 1;
                mineBoard[correct(i,board.length)][correct(j,board[i].length)] = 1;
                mineBoard[correct(i,board.length)][correct(j+1,board[i].length)] = 1;
                mineBoard[correct(i+1,board.length)][correct(j-1,board[i].length)] = 1;
                mineBoard[correct(i+1,board.length)][correct(j,board[i].length)] = 1;
                mineBoard[correct(i+1,board.length)][correct(j+1,board[i].length)] = 1;
            }
        }
    }
    
    for(let i=0; i<mineBoard.length; i++){
        for(let j=0; j<mineBoard[i].length; j++){
            if(mineBoard[i][j] === 0){
                answer++;
            }
        }
    }
    
    return answer;
}

function correct(i, len){
    let result = i;
    
    if(i<0){
        result = 0;
    }else if(i>=len){
        result = len - 1;
    }
    
    return result;
}​

처음엔 저런 함수형 프로그래밍이 익숙치 않았다.

7~8년전 저렇게 코드를 짜는 팀원분이 한분 계셨던거 같은데 팀원들이 코드 트레이스하기가 너무 어렵다고 뭐라 했던걸로 기억한다.

그런데 쓰다보니까 익숙해졌네. 요새는 대부분 이런식으로 하는지 모르겠다. 대학교 동기들한테 물어봐야겠다.

 

P.S 대학교 동기에게 물어보니 이런게 있다고 한다. 훨씬 깔끔하다. 어쩐지 map을 남발하는게 영 별로인 느낌이었는데 역시나...

https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone

 

Window: structuredClone() method - Web APIs | MDN

A deep copy of the original value. This function can be used to deep copy JavaScript values. It also supports circular references, as shown below: // Create an object with a value and a circular reference to itself. const original = { name: "MDN" }; origin

developer.mozilla.org

어째서 필자가 검색할땐 이런걸 발견하지 못한 것인가.

필자의 구글링이 엉망인 것인가 구글검색엔진이 맛이 간 것인가... 아마도 전자일 것이다.