말랑한 하루
[Programmers] 크레인 인형뽑기 게임 (Lv 1, JavaScript) 본문
[ 학습 내용 ]
- 행렬 위치 뒤집기
[ 소스 코드 ]
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]]로 변환됩니다.
'문제풀이 > Programmers' 카테고리의 다른 글
[Programmers] 비밀지도 (Lv 1, JavaScript) (0) | 2022.07.06 |
---|---|
[Programmers] 실패율 (Lv 1, JavaScript) (0) | 2022.07.06 |
[Programmers] 키패드 누르기 (Lv 1, JavaScript) (0) | 2022.06.30 |
[Programmers] 숫자 문자열과 영단어 (Lv 1, JavaScript) (0) | 2022.06.29 |
[Programmers] 신규 아이디 추천 (Lv 1, JavaScript) (0) | 2022.06.29 |