알고리즘 풀이 - [L2] 파일명 정렬2/20, [L2] 프렌즈4블록2/21

이지예·2023년 2월 21일
0

Programmers

목록 보기
3/6

코드

function solution(files) {
    return files.sort((a,b)=>{
        const headerA = a.match(/^\D+/)[0].toLowerCase();
        const headerB = b.match(/^\D+/)[0].toLowerCase();
				//숫자로 시작하지 않는, 글자뭉텅이를 소문자로 변환한다.
        if(headerA>headerB) return 1;
				//글자를 비교 했을 때, 기준값보다 글자가 크므로 a는b뒤에 온다.
        if(headerA<headerB) return -1;
				//기준값보다 글자가 작으므로 a는 b 앞에 온다.
        const numberA = a.match(/\d+/)[0].replace(/^0+/,"");
        const numberB = b.match(/\d+/)[0].replace(/^0+/,"");
		    //숫자뭉텅이의 첫번째 뭉텅이에서 맨앞에 오는 0들을 지운다.
				return numberA-numberB;
				//숫자 a,b를 비교해서 양수면 위치 바꾸고, 아니면 둔다??
    })
}

회고

바닐라 js에 대한 개념 공부가 부족했던 것 같다.

sort함수가 동작하는 방법이나 정규 표현식에 대해 공부해 볼 수 있는 문제였다.


코드

function solution(m, n, board) {
    board = board.map(v=>v.split(''));
    // map : map함수를 적용하는 변수의 길이만큼 반복해서 실행되는데, board의 n번째 값을 한 글자씩 나눈다.
    while(true){
        let founded = [];
        // 4블록이 같은 경우 마지막 블록의 좌표를 넣기 위한 배열
        for(let i=1;i<m;i++){
            for(let j=1;j<n;j++){
                if(board[i][j] && board[i][j]===board[i][j-1]&&board[i][j]===board[i-1][j]&&board[i][j]=== board[i-1][j-1]){
                    founded.push([i,j]);
                }
            }
        }
        // founded에 아무것도 없다면
        // concat : 인자로 주어진 값들을 기존 배열에 합쳐서 새 배열을 반환한다.
        // ... : 전개구문. 배열이나 문자열같이 반복 가능한 문자를 0개 이상의 인수로 확장하여 0개 이상의 키-값 쌍으로 확장할 수 있다.
        // ...하면, 배열의 인덱스마다 각각의 값이 드러나는데, 그냥 배열 이름만 적으면 각 배열의 값이 배열인 경우 Array(n)으로만 나타난다.
        // filter : 주어진 함수의 테스트를 완료하는 모든 요소를 모아 새로운 배열로 반환한다.
        //여기서는 v를 반전시켜서 내보내는듯. 글자가 있으면 말고, 글자가 없이 0값만 있으면 !!0은 false로 나오는거 보니
        //, !0은 true로 나와서 0만 걸러서 나오게 되고, 그 길이를 return
        if(!founded.length) {
            console.log(...board)
            board[0]=0
            console.log(board)
            return [].concat(...board).filter(v=>!v).length;
        }
        //4블록 같은 애들 값을 다 0으로 바꾸기
        founded.forEach(a=>{
            board[a[0]][a[1]]=0;
            board[a[0]][a[1]-1]=0;
            board[a[0]-1][a[1]-1]=0;
            board[a[0]-1][a[1]]=0;
        });

        //맨 마지막줄부터
        for(let i=m-1;i>0;i--){
            // some : 배열안의 어떤 요소라도, 판별 함수를 하나라도 통과하는지 테스트하고, true or false를 반환한다.
            //        배열의 값은 변환시키지 않는다.
            // 해당 줄의 값이 없는 경우는 패스
            if(!board[i].some(v=>!v)) continue;
            //한칸씩
            for(let j=0;j<n;j++){
                //윗 줄부터 점점 위를 탐색하는데, 현재값이 없는 경우에 계속 탐색한다.
                for(let k=i-1;k>=0&&!board[i][j];k--){
                    //탐색 값이 있는 경우
                    if(board[k][j]){
                        //탐색 값을 현재 값으로 보내고
                        board[i][j]=board[k][j];
                        //탐색 값을 없앤다.
                        board[k][j]=0;
                        break;
                    }
                }
            }
        }
    }
}

회고

map함수, concat, filter, some 함수 및 …전개구문에 대해 공부했다.

배열에 some함수를 쓰는 코드를 많이 봤다는 블로그 글을 봤다.

나머지 개념들도 알고리즘 풀이에서 많이 보이던 것들이라서 제대로 기억 해 놔야 겠다.

0개의 댓글