⚡문제정보
문제가 너무 기니까 궁금하신 분들은 직접 가서 보세요
핵심은 이렇습니다.
인형을 뽑아옴 -> 바구니에 넣음
바구니에 같은 인형이 연속으로 두개 있으면 그 인형 두개는 소멸
배열 순서대로 넣는다고 했을때 소멸한 인형의 갯수를 세어주고 반환하면 되는 문제!
🙄제한사항
board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
0은 빈 칸을 나타냅니다.
1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
moves 배열의 크기는 1 이상 1,000 이하입니다.
moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
🔍접근방법
맨 윗배열부터 탐색했을때 0인 경우 0이 아닌 경우를 만날때까지 다음 배열을 탐색한다.
만약 0이 아닌 경우를 만나는 경우 해당 요소를 stack에 push해주고 해당요소를 0으로 바꿔준다.
위 탐색을 반복하면서 stack에 같은 인형이 두개 들어오는 경우 pop해주고
answer를 올려준다.
사실 구현은 제대로 했는데 문제를 대충 읽어서 헤매고있었습니다. 흑흑
문제는 항상 제대로 읽읍시다
생각해볼 점
break를 통해 케이스를 만나면 탈출하긴 하지만 for문을 2중으로 사용하는 방법이 최선인가?
🔍나의 풀이
function solution(board, moves) {
let stack = []
let answer = 0
for(i=0; i<moves.length;i++) {
for(j=0; j<board.length; j++) {
if(board[j][ moves[i] -1 ] != 0) {
stack.push(board[j][ moves[i] -1 ])
board[j][ moves[i] -1 ] = 0
break
}
}
if(stack.length != 0 && stack[stack.length-1] == stack[stack.length-2]) {
stack.pop()
stack.pop()
answer += 2
}
}
return answer
}
코드 설명은 아래에 서술합니다.
function solution(board, moves) {
let stack = []
//뽑은 인형을 넣어둘 stack 만들기
let answer = 0
//없앤 인형을 세어줄 answer 변수
for(i=0; i<moves.length;i++) {
//moves는 인형뽑기의 시행횟수라고 할 수 있기때문에 시행횟수만큼 반복
for(j=0; j<board.length; j++) {
//board는 인형뽑기기계의 깊이라고 할 수 있음
if(board[j][ moves[i] -1 ] != 0) {
//만약 탐색중인 부분이 0이 아니라면
stack.push(board[j][ moves[i] -1 ])
//stack에 해당 요소를 push
board[j][ moves[i] -1 ] = 0
//해당 요소를 0으로 바꿔주고
break
//더 for문을 탐색할 이유가 없으니 break
}
}
if(stack.length != 0 && stack[stack.length-1] == stack[stack.length-2]) {
//만약 stack이 비지않았으면서 같은 요소가 두개겹친경우
stack.pop()
stack.pop()
//두 요소를 없애줌
answer += 2
//answer를 카운팅
}
}
return answer
//답을 리턴
}
stack.length를 비교해줘야하는 이유는
그렇지않을경우 모든 요소가 0으로 이루어진 상황에서 탐색을 하면
계속 answer가 카운팅 된다는 문제가 있어서
히든케이스 해결을 위해 넣어줬습니다.
반응형