TIL 20221202 - 150번

hoin_lee·2022년 12월 2일
0

TIL

목록 보기
115/236

오늘 공부

알고리즘 문제 풀기(프로그래머스)
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를 정한다.
  • 그 안에서 중첩으로 반복을 돌려 i번째의 숫자를 뽑아내기위해 board를 반복하여 board요소에서 i번째(i-1/인덱스는 0부터 시작이기때문)의 인형(숫자)이 무엇인지 가져온다.
  • 가져오는 방법은 쭉 돌면서 0이면 빈칸이니 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라는 함수를 만들어 행과 열을 바꾸고 진행하는 방식이다!

차이점은 데이터가 한없이 늘어나더라도 소요시간의 차이가 그렇게 나지 않는다는 것인데
내 코드와의 차이점이 바로 그것이다.
내가 작성한 코드는 데이터가 늘어나면 늘어날 수록 소요시간이 주우욱 늘어나지만 아래의 코드는 그렇게 큰 차이를 낼 정도까진 늘어나지 않는다.
이는 후에 데이터 양이 방대해질 때 문제가 되니 아래 정답을 잘 살펴봐야 겠다.

https://velog.io/@dyongdi/JS-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4%EC%9D%98-%ED%96%89%EA%B3%BC-%EC%97%B4-%EB%B0%94%EA%BE%B8%EA%B8%B0-Transposing-a-2D-array-in-JavaScript

2차원 배열의 행과 열을 바꾸는 방법으로 잘 소개된 글이다 읽고 참조해보자.

profile
https://mo-i-programmers.tistory.com/

0개의 댓글