https://school.programmers.co.kr/learn/courses/30/lessons/64061
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제는 설명이 너무 길어서 링크를 참고해야 한다.
우선 작성을 해보았는데,
여기서는 사용자의 move가 이미 다 주어져서, 생각보다 어렵진 않다.
board에 있는 2차원 함수에서 move의 x축에 있는 숫자를 하나씩뽑아서 바구니에 push하고,
바구니에 똑같은 인형 2개가 만나면 2개를 터트리고, 2개를 카운트 하면 된다.
아마 pop쓰라고 일부러 터트리는걸로 한듯..
최종 답안은 그 터트린 갯수만 주면 됨.
그렇게 일단 작성을 해보앗는데,
하도 오류가 나서 눈으로 찾을 수 있는 오타를 찾아보니 이렇게 괄호 밖으로 나온 -2가 보였다 .
우선 지금까지의 코드
function solution(board, moves) {
let count = 0;
let bucket = [];
function crane(i, move) {
if (i - 1 === board.length) { //바닥에 닿으면
return 0;
} else if (board[i][move - 1] !== 0) { //뭐가 있으면
bucket.push(board[i][move - 1]);
if (bucket[bucket.length - 1] == bucket[bucket.length - 2]) {
bucket.pop();
bucket.pop();
count++;
}
board[i][move - 1] = 0;
} else if (board[i][move - 1] === 0) { //없으면
crane(i + 1, move);
}
}
for (n of moves) {
crane(0, n);
}
return count;
}
console.log(solution([[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]], [1, 5, 3, 5, 1, 2, 1, 4]))
근데 이거 아에 작동이 안된다.
근데 디버그를 돌려보니 재귀에서 자꾸 오류가 난다.
여기서 잘못생각한게, 재귀함수를 꺼줘야할때
length와 깊이 index를 거꾸로 생각해서
function crane(i, move) {
if (i - 1 === board.length) { //바닥에 닿으면
return 0;
이 부분에서, board크기가 5이고, index가 5일때(마지막칸 뚫어버리려고 할때)
5 - 1 === 5 이게 충족이 안된다.
index를 왜 -1을 뺐지.. length도 아니고..
그래서 아래와 같이 수정했다.
그리고 추가적으로 터진 인형의 갯수라서, count를 +2로 수정했다.
function crane만 보면,
function crane(i, move) {
if (i === board.length) { //바닥에 닿으면 (바닥 뚫으려고 하면!(5길이에선 index5가 없는데 5까지 가려고할때))
return 0;
} else if (board[i][move - 1] !== 0) { //뭐가 있으면
bucket.push(board[i][move - 1]);
if (bucket[bucket.length - 1] == bucket[bucket.length - 2]) {
bucket.pop();
bucket.pop();
count += 2;//수정됨 2개씩 터져야함
}
board[i][move - 1] = 0;
} else if (board[i][move - 1] === 0) { //없으면
crane(i + 1, move);
}
}
일단 이걸로 통과는 했다.
근데 뭔가 저기 pop이 2개나 있는게 상당히 거슬린다.
애초에 일치하면, push안하고 pop한번만 하는게 훨씬 효율적이어보인다.
그래서 이렇게 바꾸고 테스트를 해봄
if (bucket[bucket.length - 1] == board[i][move-1]) {
bucket.pop();
count += 2;//수정됨 2개씩 터져야함
} else {
bucket.push(board[i][move - 1]);
}
board[i][move - 1] = 0; //빈칸으로 바꾸기
좌측이 기존, 오른쪽이 개선판
어...음...
뭐.... 거의 차이는 없다
뭐.. 배열의 크기가 워낙 작아서 그런건지.
아무튼 컴퓨터의 동작은 3개정도 줄이긴 했다.
아래가 최종 코드
function solution(board, moves) {
let count = 0;
let bucket = [];
function crane(i, move) {
if (i === board.length) { //바닥에 닿으면 (바닥 뚫으려고 하면!(5길이에선 index5가 없는데 5까지 가려고할때))
return 0;
} else if (board[i][move - 1] !== 0) { //뭐가 있으면
if (bucket[bucket.length - 1] == board[i][move-1]) {
bucket.pop();
count += 2;//수정됨 2개씩 터져야함
} else {
bucket.push(board[i][move - 1]);
}
board[i][move - 1] = 0; //빈칸으로 바꾸기
} else if (board[i][move - 1] === 0) { //없으면
crane(i + 1, move);
}
}
for (n of moves) {
crane(0, n);
}
return count;
}