N

(프로그래머스 KAKAO JS)파괴되지 않은 건물 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 KAKAO JS)파괴되지 않은 건물

naeunchan 2022. 2. 15. 11:14
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/92344

 

코딩테스트 연습 - 파괴되지 않은 건물

[[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5]] [[1,0,0,3,4,4],[1,2,0,2,3,2],[2,1,0,3,1,2],[1,0,1,3,3,1]] 10 [[1,2,3],[4,5,6],[7,8,9]] [[1,1,1,2,2,4],[1,0,0,1,1,2],[2,2,0,2,0,100]] 6

programmers.co.kr

 

새로운 알고리즘을 배웠다.

누적합을 효율적으로 처리할 수 있는 알고리즘이다.

 

IMOS 알고리즘이라고,

아래 블로그에서 설명이 자세하게 잘 나와있어서 참고해서 풀 수 있었다.

https://nicotina04.tistory.com/163

 

imos법 imos method いもす法

이 게시글에서는 imos법에 대해 배우고 관련 문제를 푼다. imos법이란? 이름의 유래는 작성자도 잘 알지 못하지만 일본에서 온 것으로 추정된다. imos법은 다음과 같은 형태를 가진 문제를 풀 때 사

nicotina04.tistory.com

 

우선 imos를 처리하기 위한 배열을 선언해야 한다.

imos 배열의 크기는 주어진 board의 행과 열의 +1 크기만큼 선언한다.

 

skill을 순회하면서 각 좌표에 degree를 처리한다.

type = 1이면 공격이기 때문에 -degree, 2면 회복이기 때문에 degree를 imos에 적용하면 된다.

단, imos 규칙에 따라 4개의 좌표에 알맞게 적용해야 한다.

 

imos[r1][c1] += type === 1 ? -degree : degree

imos[r1][c2 + 1] += type === 1 ? degree : -degree

imos[r2 + 1][c1] += type === 1 ? degree : -degree

imos[r2 + 1][c2 + 1] += type === 1 ? -degree : degree

 

지그재그로 잘 나와있어서 외우기 쉬울 것 같다.

 

imos 적용이 끝났으면 누적합을 행과 열에 대해 진행해주면 된다.

이후 board를 순회하면서 imos에 저장된 누적합을 더해 1 이상인 경우 answer++을 해주면 된다.

 

const solution = (board, skill) => {
    let answer = 0;
    const row = board.length;
    const col = board[0].length;
    const imos = Array.from({length: row + 1}, () => Array(col + 1).fill(0));
    
    for(let i = 0; i < skill.length; i++){
        const [type, r1, c1, r2, c2, degree] = skill[i];
        
        imos[r1][c1] += type === 1 ? -degree : degree;
        imos[r1][c2 + 1] += type === 1 ? degree : -degree;
        imos[r2 + 1][c1] += type === 1 ? degree : -degree;
        imos[r2 + 1][c2 + 1] += type === 1 ? -degree : degree;
    }
    
    for(let i = 0; i < row; i++){
        let sum = 0;
        
        for(let j = 0; j < col; j++){
            sum += imos[i][j];
            imos[i][j] = sum;
        }
    }
    
    for(let i = 0; i < col; i++){
        let sum = 0;
        
        for(let j = 0; j < row; j++){
            sum += imos[j][i];
            imos[j][i] = sum;
        }
    }
    
    for(let i = 0; i < row; i++){
        for(let j = 0; j < col; j++){
            board[i][j] += imos[i][j];
            
            if(board[i][j] > 0){
                answer++;
            }
        }
    }
    
    return answer;
}
728x90
반응형