일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- camera permission
- vercel git lfs
- github pdf
- github lfs
- react-native
- ffi-napi
- electron-packager
- 티스토리 성능
- react-native-dotenv
- html
- Recoil
- npm package
- adb pair
- silent printing
- 이미지 데이터 타입
- Failed to compiled
- augmentedDevice
- nextjs
- custom printing
- adb connect
- device in use
- Git
- rolldown
- Each child in a list should have a unique "key" prop.
- camera access
- animation
- ELECTRON
- Can't resolve
- dvh
- github 100mb
- Today
- Total
Bleeding edge
[프로그래머스] 크레인 인형뽑기 - 자바스크립트 본문
https://school.programmers.co.kr/learn/courses/30/lessons/64061
처음에 봤을 때 이 문제가 레벨1이라니! 하고 놀랬었던 문제.. 지금 와서 보니 레벨 1 맞는거 같은게 엄청 크게 고민해야할 것보다는 구현 로직이 상당히 심플하다. 단지 2차원을 쓰는게 익숙하지 않아서 어렵다고 생각이 들었던거 같다.
문제 로직은 상당히 심플하다 board와 move 두가지가 주어진다.
1. board에 있는걸 move에 있는 순서대로 한개씩 0으로 만들어준다.
2. 0으로 만든 숫자는 queue에 넣는다
2-1 만일 queue의 맨 위에 있는 숫자와, 넣을 숫자가 같다면 넣지 않고 queue를 pop시킨다.
2-2 sum을 더한다(sum은 함수 맨처음에 선언해야한다)
1. 함수를 두개로 나누어 풀이를 했다. 우선, board에 있는 인형을 받는 함수를 만들었다
board는 실시간으로 업데이트가 되야하기 때문에, board를 return해야한다. 그리고, 인형이 빈칸인지 아닌지 구분하여, 빈칸이면 -1 숫자가 있다면 제거한 숫자를 return 한다
2. 전체함수를 작성한다
function solution(board, moves) {
let sum = 0
let queue = []
let arrangedDoll = -1
for(let i=0;i<moves.length;i++){
[board, arrangedDoll] = pickUpDoll(board, moves[i])
//새로 작성이 필요한 곳
}
}
이제, board와 arrangedDoll을 업데이트가 가능하다. 콘솔을 찍어보면 board의 변화와, 인형이 어떤것이 튀어나왔는지 알 수 있다.
3. 만일 queue의 맨 위에 있는 숫자와, 넣을 숫자가 같다면 넣지 않고 queue를 pop시킨다.의 로직을 가진 함수를 작성한다
function removeDoll(queue, pickedDoll, sum){
if(queue.length===0){
queue.push(pickedDoll)
return [queue, sum]
}else{
const highestDoll = queue[queue.length-1]
if(highestDoll===pickedDoll){
queue.pop()
return [queue, sum+2]
}else{
queue.push(pickedDoll)
return [queue, sum]
}
}
queue.push(pickedDoll)
return [queue, sum]
}
queue를 항상 업데이트하고, 몇 개를 제거했는지 update가 가능해졌다.
4. 전체식에서 sum을 업데이트한다
function solution(board, moves) {
let sum = 0
let queue = []
let arrangedDoll = -1
for(let i=0;i<moves.length;i++){
[board, arrangedDoll] = pickUpDoll(board, moves[i])
if(arrangedDoll !== -1){
[queue, sum] = removeDoll(queue, arrangedDoll, sum)
}
}
return sum
}
전체 풀이
function solution(board, moves) {
let sum = 0
let queue = []
let arrangedDoll = -1
for(let i=0;i<moves.length;i++){
[board, arrangedDoll] = pickUpDoll(board, moves[i])
if(arrangedDoll !== -1){
[queue, sum] = removeDoll(queue, arrangedDoll, sum)
}
}
return sum
}
function removeDoll(queue, pickedDoll, sum){
if(queue.length===0){
queue.push(pickedDoll)
return [queue, sum]
}else{
const highestDoll = queue[queue.length-1]
if(highestDoll===pickedDoll){
queue.pop()
return [queue, sum+2]
}else{
queue.push(pickedDoll)
return [queue, sum]
}
}
queue.push(pickedDoll)
return [queue, sum]
}
function pickUpDoll(board, number){
number--
if(board[board.length-1][number]===0) return [board, -1]
for(let i=0;i<board.length;i++){
if(board[i][number]!==0){
const arrangedDoll = board[i][number]
board[i][number]=0
return [board, arrangedDoll]
}
}
return [board, -1]
}
함수를 찢어서 푸니 어디서 문제가 생겼는지 찾는게 쉬워졌다. 이제 레벨1은 모두 풀었으니 레벨2로 다시!
'코딩테스트 공부' 카테고리의 다른 글
조합 구하기 (0) | 2024.07.08 |
---|---|
[프로그래머스] 멀리뛰기 - 자바스크립트 (0) | 2022.07.22 |
[프로그래머스] 키패드 누르기 - 자바스크립트 (0) | 2022.07.18 |
[프로그래머스] 신고 결과 받기 - 자바스크립트 (0) | 2022.07.18 |
최소공배수와 최대공약수에 관해서 (0) | 2022.07.06 |