코딩쌀롱
[프로그래머스_JS] 크레인 인형뽑기_reduce로 행, 열 교체 본문
문제
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문을 사용했다.
작성한 코드는 아래와 같다.
'개발공부' 카테고리의 다른 글
함수형 프로그래밍 키워드 정리 (0) | 2021.01.21 |
---|---|
[프로그래머스_JS] 모의고사 (0) | 2021.01.20 |
[JS] 반복문 사용하지 않고 배열 생성, 값 넣기 (0) | 2021.01.20 |
원형 연결 리스트(circular linked list), 이중 연결 리스트(double linked list) (0) | 2021.01.14 |