말랑한 하루

[Programmers] 크레인 인형뽑기 게임 (Lv 1, JavaScript) 본문

문제풀이/Programmers

[Programmers] 크레인 인형뽑기 게임 (Lv 1, JavaScript)

지수는말랑이 2022. 7. 6. 17:24
반응형

[ 학습 내용 ]
- 행렬 위치 뒤집기

[ 소스 코드 ]

function solution(board, moves) {
    var answer = 0;
    var index = {};
    for(var i = 0; i < board.length; i++) {
        for (var j = 0; j < board[i].length; j++) {
            if (board[i][j] !== 0 && index[j] === undefined) {
                index[j] = i;
            }
        }
    }
    
    var box = [];
    moves.map((move) => {
        if (index[move - 1] === board.length) return;
        let item = board[index[move - 1]][move - 1];
        
        index[move - 1] += 1;
    
        if (box.length === 0) {
            box.push(item);
            return;
        }
        
        if (item === box[box.length - 1]) {
            box.pop();
            answer += 2;
        } else {
            box.push(item);
        }
    })
    return answer;
}


[ 심화 코드 ]

const transpose = matrix =>
    matrix.reduce(
        (result, row) => row.map((_, i) => [...(result[i] || []), row[i]]),
        []
    );

const solution = (board, moves) => {
    const stacks = transpose(board).map(row =>
        row.reverse().filter(el => el !== 0)
    );
    const basket = [];
    let result = 0;

    for (const move of moves) {
        const pop = stacks[move - 1].pop();
        if (!pop) continue;
        if (pop === basket[basket.length - 1]) {
            basket.pop();
            result += 2;
            continue;
        }
        basket.push(pop);
    }

    return result;
};

[ 코드 분석 ]

- map

대상의 되는 배열의 각 요소를 화살표 함수의 반환값으로 대체

 

- reduce

reduce는 1) callback과 2) initialValue을 포함한 배열을 가진 2개의 인자로 구성되고, 1) callback함수는 4개의 인자를 가지며 누적 계산값의 결과값을 반환합니다.

reduce의 1) callback함수가 포함하는 4개 인자는 다음과 같다.

1-1) accumulator : 콜백의 반환값을 누적합니다.(현 소스코드에서 result)

1-2) currentValue : 처리할 현재 요소

1-3) currentIndex : 처리할 현재 요소의 인덱스

1-4) array : reduce를 호출한 배열

2) initialValue

callback의 최초 호출에서 첫 인수에 제공하는 값이다. 초기값을 제공하지 않으면 배열의 첫 요소를 사용한다. 만약, 빈 배열에서 초기값 없이 reduce를 호출하는 경우 오류가 발생함.

현재 reduce에서 돌아가고 있는 인덱스의 이전 반환값을 result에 저장한다.

 

- 비구조화 할당

...[item1] 구문으로 새로운 배열에 할당되어 [item, ...[item1]]의 모습을 띄우는 경우 해당 배열의 결과값은 [item, item1]

 

행열을 바꾸는 transpose의 board값이 [[1,2,3], [4,5,6]]인 경우 다음과 같이 진행된다.

reduce는 [1,2,3], [4,5,6] 두번 실행된다. 각 배열은 map((_, i) => [(result[i] || []), row[i]])에서 다음과 같이 진행된다.

[1,2,3]일 때, 1에 대한 예시는 다음의 결과값을 가집니다.

[...result[0] || []), row[0]) = [...result[0] || []), 1)

→ result[0] == [][0] == null

→ [...[], 1]

위가 반복되어 [1,2,3]의 결과값은 [[...[], 1], [...[], 2], [...[], 3]] ==[[1], [2], [3]]이 됩니다.

 

[4,5,6]일 때, 4에 대한 결과값은

[...result[0] || []), row[0]) = [...result[0] || []), 4)

→ result[0] == [1]

→ [...[1], 4]

위가 반복되어 [4,5,6]의 결과값은 [[...[1], 4], [...[2], 5], [...[3], 6]] ==[[1,4], [2,5], [3,6]]이 됩니다.

 

즉 transpose 함수에 입력된 board [[1,2,3], [4,5,6]]의 행렬이 변환되어 [[1,4], [2,5], [3,6]의 배열이 반환됩니다.

문제의 [[0, 0, 0, 0, 0], [0, 0, 1, 0, 3], [0, 2, 5, 0, 1], [4, 2, 4, 4, 2], [3, 5, 1, 3, 1]] 행열은

결과적으로 [[0, 0, 0, 4, 3],[0, 0, 2, 2, 5],[0, 1, 5, 4, 1],[0, 0, 0, 4, 3],[0, 3, 1, 2, 1]]로 변환됩니다.

반응형
Comments