알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm
JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS
React 강의 듣기
https://github.com/hoinlee-moi/React_prac
감기가 점점 나아지면서 조금씩 좋아지는 것 같다.
이번 주말동안 좋아진 컨디션으로 최대한 많은 강의랑 수업등을 나가야지
목표지점은 리액트 강의 절반 이상까지 진도를 나가는 것과 js심화 강의를 전부 들어보는 것!
오늘알고리즘
크레인 인형뽑기
function solution(board, moves) {
let count = 0
let answer = [];
moves.forEach(val=>{
for(let i=0;i<=board.length-1;i++){
if(board[i][val-1]!=0){
answer.push(board[i][val-1])
board[i][val-1] = 0
break;
}
}
})
while(true){
for(let i=1;i<=answer.length-1;i++){
if(answer[i]===answer[i-1]){
count +=2
answer.splice(i-1,2)
}
}
if(answer.filter((v,i)=> v===answer[i+1]).length===0) break;
}
return count
}
moves
를 통해 첫번째 반복될 수 i
를 정한다.board
를 반복하여 board
요소에서 i
번째(i-1
/인덱스는 0
부터 시작이기때문)의 인형(숫자)이 무엇인지 가져온다.answer
이란 배열에 집어넣고 해당 board
의 요소의 i번째 수는 0으로 변경 시킨다.board
반복은 break;
시켜 다음번 i로 넘어갈 수 있도록 한다answer
에 꺼낸 모든 인형이 들어가게 되는데 겹치는 인형 모두를 계속 제거할 수 있도록 while
문을 쓴다.while
문은 계속 반복되며 반복 할 때마다 for
문을 통해 앞의 인덱스와 뒤에 인덱스가 같을 경우 splice
로 원본배열을 건드려 삭제시킨다.while
문을 통해 계속 반복됨으로 모두 삭제된다.filter
를 통해 반복되는 값이 있는지 검사하고 없으면 break;
한다.while
이 반복되며 붙어있는 수를 삭제 시킬때마다 인형의 개수를 count
를 2씩 상승시켰으니 count
를 반환하면 정답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;
};
다른 사람 정답인데 행과 열을 바꾸는 transpose
라는 함수를 만들어 행과 열을 바꾸고 진행하는 방식이다!
차이점은 데이터가 한없이 늘어나더라도 소요시간의 차이가 그렇게 나지 않는다는 것인데
내 코드와의 차이점이 바로 그것이다.
내가 작성한 코드는 데이터가 늘어나면 늘어날 수록 소요시간이 주우욱 늘어나지만 아래의 코드는 그렇게 큰 차이를 낼 정도까진 늘어나지 않는다.
이는 후에 데이터 양이 방대해질 때 문제가 되니 아래 정답을 잘 살펴봐야 겠다.
2차원 배열의 행과 열을 바꾸는 방법으로 잘 소개된 글이다 읽고 참조해보자.