Early Riser
생각정리
Early Riser
전체 방문자
오늘
어제
  • 분류 전체보기 (128)
    • JS (19)
    • React (33)
    • React Native (2)
    • Library, Tool (13)
    • CSS (2)
    • Algorithm (40)
    • Computer Science (3)
    • 회고 (3)
    • AI (13)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • LGBM
  • 프로그래머스
  • react
  • 구현
  • dfs
  • BFS
  • js
  • 논문리뷰
  • 파이썬
  • local minima
  • 부스트캠프 9기
  • useState
  • 백준
  • 손실함수
  • 부스트캠프 합격
  • 딥러닝
  • 알고리즘
  • 자바스크립트
  • 완전탐색
  • 밑바닥
  • 오늘의불경
  • 백트래킹
  • RNN
  • 부스트캠프 합격 후기
  • global minima
  • useEffect
  • lightgbm
  • javascript
  • boosting
  • 비동기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Early Riser

생각정리

프로그래머스: 프렌즈 4 블록(javascript, 구현)
Algorithm

프로그래머스: 프렌즈 4 블록(javascript, 구현)

2023. 5. 4. 18:34

애니팡같은 게임을 구현하는 문제이며 구현문제이나 javascript는 문자열이 immutable이라서 처리하는데 조금 애를 먹었던 문제였다. 파이썬으로는 되게 쉽게 풀었던것 같은데..

 

로직은 간단하다. 2차원 배열을 2x2 정사각형으로 탐색하며 2x2블록안의 문자가 모두 같다면 배열에 그 위치를 모두 저장하면 된다. 배열에 저장하는 이유는 한 위치가 두 블록에 중복되게 포함될 수 있으므로 위치들을 모두 저장했다가 탐색이 끝나면 한번에 지워야 한다. 그 후 빈 블록을 제외한 나머지 블록들을 아래로 내리는 작업을 반복하면 된다.

 

javascript의 문자열이 immutable이라서 문자열을 [행,열]로 접근하지 않고 행을 통채로 교체하는 방식으로 배열을 바꿨다.

function solution(m, n, board) {
    let answer = 0;
    let cash = 1
    while(cash){
        cash = 0
        let deleted = []
        for(let r=0; r<m-1; r++){
            for(let c=0; c< n-1; c++){
                if(board[r][c] !== '0' && board[r][c] === board[r][c+1] && board[r][c+1] === board[r+1][c+1] && board[r+1][c+1] === board[r+1][c]){
                    for(const [x,y] of [[r,c], [r+1, c], [r,c+1], [r+1, c+1]]){
                        if(!(deleted.some(item => item.join() === [x, y].join()))){
                            deleted.push([x,y])
                        }
                    }
                }
            }
        }
        cash = deleted.length
        answer += cash

        // 일치하는 문자열 지우기
        for(const [r,c] of deleted){
            board[r] = board[r].slice(0,c)+'0'+board[r].slice(c+1,n)
        }

        // 아래로 내리기
        for(let c=0; c<n; c++){
            let cash = ''
            for(let r=m-1; r>=0; r--){
                cash += board[r][c]
            }
            let zero = 0
            for(let i=0; i<m; i++){
                if(cash[i] === '0'){
                    zero++
                }
            }
            cash = cash.replace(/0/g, "")+'0'.repeat(zero)
            for(let r=0; r<m; r++){
                board[r] = board[r].slice(0,c) + cash[m-r-1] + board[r].slice(c+1,n)
            }
        }
    }
    return answer;
}

'Algorithm' 카테고리의 다른 글

프로그래머스: 단속카메라(javascript, greedy)  (0) 2024.03.31
프로그래머스: 숫자 변환하기(javascript, deque, bfs)  (0) 2023.05.09
프로그래머스: 파일명 정렬(javascript, 구현)  (0) 2023.05.03
백준 1987번: 알파벳(javascript, DFS, 백트래킹)  (0) 2023.04.10
백준 2529번: 부등호 (javascript, DFS, 백트래킹)  (0) 2023.04.09
    'Algorithm' 카테고리의 다른 글
    • 프로그래머스: 단속카메라(javascript, greedy)
    • 프로그래머스: 숫자 변환하기(javascript, deque, bfs)
    • 프로그래머스: 파일명 정렬(javascript, 구현)
    • 백준 1987번: 알파벳(javascript, DFS, 백트래킹)
    Early Riser
    Early Riser
    2년차 프론트엔드 개발자입니다. https://github.com/EarlyRiser42

    티스토리툴바