본문 바로가기
Algorithm/프로그래머스

[프로그래머스/C++] 파괴되지 않은 건물 (2022 KAKAO BLIND RECRUITMENT)

by code_pie 2024. 1. 29.
 
 
 
 

 

풀이

 

[문제 풀이]

 

단순히 각 구간에 계산을 전부 해주면 250,000*1,000*1000이 되어 시간을 초과하게 된다.

그래서 구간을 전부 계산하는 것이 아닌, 시작 부분과 끝나는 부분에만 숫자를 더해 누적합으로 풀면 된다.

예를 들어 스킬이 [0,5,5,5,5,0]과 같이 데미지가 들어간다면, 이를 [0,5,0,0,0,-5]와 같이 표시할 수 있는 것이다.

 

이를 2차원으로도 확장 시킬 수 있는데

 

아래와 같이 변환 할 수 있다.

 

오른쪽의 변환된 정보를 x 축 기준으로 누적합을 계산한 다음 y축을 따라 다시 누적합을 계산하면 왼쪽과 같은 형태가 된다.

아래와 같은 순서로 압축

 압축한 정보를 이용할 경우는 아래와 같이 압축해제

모든 Skill에 대한 degree가 정리되면 압축한 정보를 해제해 건물의 내구도가 남아있는지 확인하면 된다.

[아이디어 정리]

  1. 스킬의 시작 범위와 끝 범위를 이용해 누적합으로 표현한다.
  2. 누적합을 2차원으로 확장해 기록의 횟수를 줄인다.
  3. 누적합으로 skill의 degree가 전부 계산이 되면 내구도가 남아있는 건물의 수를 return한다.

 

 

Code

 

 

#include <string>
#include <vector>
using namespace std;

int solution(vector<vector<int>> board, vector<vector<int>> skill) {
    int answer = 0, y = board.size(), x = board[0].size();
    vector<vector<int>>skillDamage(y,vector<int>(x,0));
    vector<vector<int>>damageRec(y,vector<int>(x,0));
    for (int i=0; i<skill.size();i++)
    {
        int d=skill[i][5];
        if (skill[i][0]==2)
        {
            d*=-1;
        }
        skillDamage[skill[i][1]][skill[i][2]]+=d;
        if (skill[i][4]+1<x)
        {
            skillDamage[skill[i][1]][skill[i][4]+1]-=d;
        }
        if (skill[i][3]+1<y)
        {
            skillDamage[skill[i][3]+1][skill[i][2]]-=d;
            if (skill[i][4]+1<x)
            {
                skillDamage[skill[i][3]+1][skill[i][4]+1]+=d;
            }
        }
    }
    for (int i=0; i<y; i++)
    {
        for (int j=1; j<x; j++)
        {
            skillDamage[i][j]+=skillDamage[i][j-1];
        }
    }
    for (int j=0; j<x; j++)
    {
        for (int i=1; i<y; i++)
        {
            skillDamage[i][j]+=skillDamage[i-1][j];
            if (skillDamage[i][j]<board[i][j])
            {
                answer+=1;
            }
        }
    }
    for (int j=0; j<x; j++)
    {
        if (skillDamage[0][j]<board[0][j])
        {
            answer+=1;
        }
    }
    return answer;
}

 


 
 
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

반응형