코딩쌀롱

[프로그래머스_JS] 크레인 인형뽑기_reduce로 행, 열 교체 본문

개발공부

[프로그래머스_JS] 크레인 인형뽑기_reduce로 행, 열 교체

이브✱ 2021. 1. 20. 16:04

문제

프로그래머스 크레인 인형뽑기 게임 문제

input: 1) 게임 화면의 격자 상태가 담긴 2차원 배열 board  

             2) 인형을 집기 위해 크레인을 작동시킬 위치가 담긴 배열 moves

output: 크레인을 모두 작동시킨 후 터뜨려져 사라진 인형의 개수(number)

 

나의 풀이

한 달 전쯤 같은 문제를 풀었었는데 그 때는 이중 for문으로 풀었었다. 그래서 이번에는,

1. for문을 사용하지 않고

2. reduce를 사용해서 2차원 배열의 행, 열을 바꿔주는 함수도 직접 작성해보기로 했다.

 

let board = [ 
    [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]
];

문제에서 input으로 주는 2차원 배열 board는 위처럼 생겼다. board 배열의 원소들은 게임 화면으로 봤을 때 위부터 아래 방향으로 행이다. 즉 위 코드 보이는 대로 쌓여있는 모양이라고 생각하면 된다.

 

문제에서 input으로 주는 moves 배열의 원소들은 크레인을 작동시킬 위치로, 열을 의미한다. 예를 들어 moves가 [1, 2, 3]이라고 하면 첫 번째 열(00043)에서 가장 위에 있는 4를 뽑고, 두 번째 열(00225)에서 가장 위에 있는 2를 뽑고, 세 번째 열(01541)에서 가장 위에 있는 1을 뽑을 것이다.

 

board는 게임 화면의 행으로 이루어진 배열이고, moves게임 화면의 열을 가리키는 원소들로 이루어진 배열이다.

 

board에서 1번째 열에서 제일 위에 있는 인형을 뽑으려면 board[i][0] 원소를 살펴야 한다. 그래서 이전에 풀었을 때는 이중 for문을 사용했던 것이다. 그런데 만약에 board를 열의 형태로 바꿔준다면 for문을 한 번 줄일 수 있다. board의 1번째 열에서 인형을 뽑을 때 board[0]의 원소들을 탐색해보면 되기 때문.

 

 

reduce를 사용해서 2차원 배열의 행, 열을 바꿔주도록 함수를 작성했다.

이 함수는 arr.map에서 arr 길이 만큼만 돌기 때문에 행, 열의 개수가 같을 때만 동작한다😞 

직접 작성해봤다는 것에 의의를....두는 것으로...🙄

const row2col = board => board.reduce((acc,_,i,arr) => acc.concat([arr.map(e => e[i])]),[]);

 

그리고 moves의 모든 원소들을 다 돌아야 하기 때문에 forEach문을 사용했다.

작성한 코드는 아래와 같다.

 

Comments