728x90
[Javascript] (프로그래머스 level 1) 크레인 인형뽑기 게임
💡 구글에 Javascript 풀이가 많이 없거나, 배운 점이 있으면 포스팅합니다.
내 풀이
function solution(board, moves) {
// 아래부터 차곡차곡 쌓여있다
// 153에서 뽑아서 스택에 쌓는다.
// 스택에 같은 인형 만나면 둘다 없어짐
// 인형 없는 곳에 작동하면 아무일도 안일어남
// 바구니 크기는 무한
// 크레인 작동시킨 후 터뜨려 사라진 인형의 개수를 return
// board는 55이상 3030 이하
// board 0은 빈칸, 1~100은 각각 인형
// moves 1~1000, 각 배열의 가로 줄 [1,5,3,5,1,2,1,4] 핑크 악어 볼 볼 악 무 핑
const doll = {
count : 0,
stack : [],
board : board,
}
// moves 배열을 실행한다. pickDoll(moves[i])
for (let i = 0; i < moves.length; i++) {
pickDoll(moves[i], doll);
}
// stack 체크 (투포인터) //ex [1,1,2,3,3,2,2,3,3,1,5,6]
let dist = 1;
for (let p1 = 0; p1 < doll.stack.length; p1++) {
if (doll.stack[p1] <= 0) {
dist = 1;
continue;
}
if (doll.stack[p1] === doll.stack[p1 + dist]) {
doll.count += 2;
doll.stack[p1] = -1;
doll.stack[p1 + dist] = -1
//여기 예외처리가 힘들었음
while(doll.stack[p1] === -1 && (p1 > 0)) {
p1--;
}
while(doll.stack[p1 + dist] === -1 && (p1 + dist <= doll.stack.length)) {
dist++;
}
p1--;
}
}
return doll.count;
}
function pickDoll(column, doll) {
let col = column - 1;
// board의 column에 각 로우에 인형이 있는지 확인
// 인형 있으면 0으로 만들고, 스택에 push
for (let i = 0; i < doll.board.length; i++) {
let pos = doll.board[i][col];
if (pos === 0) {
continue;
}
doll.stack.push(pos);
doll.board[i][col] = 0;
// break 안해서 10분 날림
break;
}
return;
}
다른 사람 풀이
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;
};
- 와 미쳤다 👍
- 1) 트랜스포즈라는 함수로 보드에서 필요없는 0을 빼서 탐색 시간을 줄임 (이게 진짜 대박이네 생각도 못했는데, 0이 졸라 많으면 왠 헛수고지 ? 했는데 좋은 방법이네.. )
- 2) 나는 스택에 푸시하고 바로 같은놈체크하고 팝하면 안좋을 줄 알고 그랬는데, 나중에 while처리하고 하면서 힘들었음 근데 그냥 바로바로 스택에 넣자마자 팝하면 훨씬 편했음
- 3) stack에 넣고 보드에서 뺄때도 보드에서 pop하면서 동시에 그 return값을 stack에 푸쉬해줌으로 2줄짜리를 1줄로 처리했다.
배운 점, 느낀 점
- 아이디어 2가지가 다름으로 이렇게 좋은 코드가 나왔다는게 신기하다.
- 나는 그냥 생각의 흐름대로 짠 코드라고 보여지고, 다른 사람 코드는 생각을 좀 더 깊게 하고 짠 코드같다. 굳굳
시간
- 다행히 해설 안보고 직접 푸는데 1시간 안걸렸다. 물론 더 빨라져야 하는 시간이지만, 혼자 풀었는데 1시간이내로 풀었으면 내 실력에 비해 잘했다. 굳
'Coding Test > JavaScript' 카테고리의 다른 글
[Javascript] (프로그래머스 level 2) 다음 큰 숫자 (0) | 2022.07.01 |
---|---|
[Javascript] (프로그래머스 level 2) 최댓값과 최솟값 (0) | 2022.07.01 |
[Javascript] (프로그래머스 level 2) JadenCase 문자열 만들기 (0) | 2022.07.01 |
[Javascript] (프로그래머스 level 2) 오픈채팅방 (0) | 2022.07.01 |
[Javascript] (프로그래머스 level 1) 키패드 누르기 (0) | 2022.07.01 |
[Javascript] (프로그래머스 level 1) 내적 (0) | 2022.07.01 |
[Javascript] (프로그래머스 level 1) 모의고사 (0) | 2022.06.30 |
[Javascript] (프로그래머스 level 1) 체육복 (0) | 2022.06.30 |
댓글