만든 답 ! 정답~
function solution(board, moves) {
const bucket = [];
let result = 0;
for (const m of moves) { // 1번 loop
for (let b = 0; b < board.length; b++) { // 2번 loop
if (board[b][m-1] > 0) { // "m-1" 체크
if (bucket[bucket.length -1] === board[b][m-1]) { // bucket 값의 맨위와 새로들어오는 값을 비교해야함.
result += 2;
bucket.pop();
} else {
bucket.push(board[b][m-1]); // 같은 값이 아니면 push.
}
board[b][m-1] = 0; // board에서 뽑은 값은 0으로 변경.
break;
}
}
}
return result;
}
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]]
moves = []
생각의 흐름
"move의 값에 따라 나뉘겠다."
1 ->board[x][0]
2 ->board[x][1]
3 ->board[x][2]
4 ->board[x][3]
5 ->board[x][4]
"이렇게 하면 크레인이 각각 move 위치에서 내려가는 행동이 되겠구나."
"x를 loop 돌려야겠다 !"
어디까지 x를 돌려야 하나? => board.length까지. 2차원 값은 이미 정해져있으니 1차원의 길이까지만 돌리면 크레인이 끝까지 내려가는 것이다.
for (let b = 0; b < board.length; b++) { }
"move도 loop를 돌려야된다. !"
move는 흔한 for문(i++)이 아니라 "for (x of array)" 형식으로 돌려야 한다.
for (const m of moves) { }
"board[ ][ ]의 값이 0이면 인형이 없는 것이다."
만약 0이 아니라면 그 값을 bucket에 넣는다.
if (board[b][m-1] > 0) {
bucket.push(board[b][m-1]);
board[b][m-1] = 0; // ! 인형을 뺏으므로 0으로 변경
}
break; // 그리고 브레이크.다시 새로운 const m 을 받아서 시작한다.
break는 한개의 for문만 닫는다. 그래서 "for (const m of moves)" 가 다시 시작된다.
"이렇게 진행하면 moves의 값들이 돌아감에 따라서 bucket[ ]에 값들이 쌓이게 된다. 하지만 이 게임에서는 가만히 쌓이기만 하면 안된다. 연속된 값이 똑같은 값이라면 제거해주고 result += 2; 해줘야 한다."
"어디서 그 작업을 해야하지?"
board[b][m -1] 값이 0 보다 클때 bucket으로 들어가기전에 이전에 있는 bucket의 마지막 index값과 비교를 진행하면 된다. 진행한뒤 값이 같다면 두값을 없애고(아직 bucket에 들어가지 않았으므로 bucket에 이미 있던 값만 pop() 해주면 된다.) result += 2; 하면 된다.
코드를 바꿔야 한다.
if (board[b][m-1] > 0) {
if (bucket[bucket.length -1] === board[b][m - 1]) { bucket에 이전에 있었던 값과 같다면.
result += 2;
bucket.pop();
} else {
bucket.push(board[b][m -1]);
}
board[b][m -1] = 0; //인형을 bucket에 넣었으므로 0
break;
}
}
추상화 과정
1- move loop 'm' ( moves)
2- board loop 'b' (<board.length)
3- ( board[b][m] != 0) => {
bucket.push(bucket[b][m]);
bucket[b][m] = 0; }
여기까지가 bucket에 인형을 넣는 과정.
bucket에 연속으로 같은 인형이 나오면 제거해주는 것을 넣어야한다. 어디다가 넣지?
"push" 하기전에 확인해주는게 좋겠다.
1- move loop 'm' ( moves)
2- board loop 'b' (<board.length)
3- ( board[b][m] != 0) => { // ! 여기에 확인하는 과정 추가 !
bucket.push(bucket[b][m]);
bucket[b][m] = 0; }
여기까지가 bucket에 인형을 넣는 과정.
1- move loop 'm' ( moves)
2- board loop 'b' (<board.length)
3- ( board[b][m] != 0) => {
if ( 이전 인형과 push하려는 버켓이 같은지 확인) {
같으면 이전 인형을 지운다.
bucket.push(bucket[b][m]);
bucket[b][m] = 0; }
여기까지가 bucket에 인형을 넣는 과정.
'CS > 알고리즘' 카테고리의 다른 글
종이접기 [프로그래머스] 실패 (0) | 2020.07.14 |
---|---|
탑 _프로그래머스 (0) | 2020.05.06 |
k번째수 (0) | 2020.05.04 |
완전탐색 모의고사 수포자 / '%'를 쓸줄아느냐. (0) | 2020.05.04 |
완주하지 못한 선수. (0) | 2020.05.04 |