hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

22.06.10. 풀었던 문제들

1. 파괴되지 않은 건물

naive하게 brute-force로 풀면 O(1000 * 1000 * 25만)이어서 절대 풀 수 없는 문제. 그래서 row를 고정시키고 column에서 누적합으로 푸는 방식을 택했는데 - O(1000 * 25만)이어서 여전히 시간 초과가 난다.

해결법은 2차원 누적 합이었다. 2차원은 생각을 못하고 있었는데, 풀고 나니 재밌는 문제였다.

// 파괴되지 않은 건물

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int N, M;
typedef pair<int, int> pii;

int solution(vector<vector<int>> board, vector<vector<int>> skill) {
    N = board.size(); M = board[0].size();
    vector<vector<int>> datas(N, vector<int>(M, 0));
    
    for(vector<int> v : skill){
        int type = v[0], r1=v[1], c1=v[2], r2=v[3], c2=v[4], degree=v[5];
        if(type==1) degree *= -1;
        
        datas[r1][c1] += degree;
        if(c2 + 1 < M) datas[r1][c2 + 1] -= degree;
        
        if(r2 + 1 < N) datas[r2 + 1][c1] -= degree;
        if(r2 + 1 < N && c2 + 1 < M) datas[r2+1][c2+1] += degree;
    }
    
    for(int r =0; r<N; r++){
        for(int c =1; c<M; c++){
            datas[r][c] += datas[r][c-1];
        }
    }
    for(int c =0; c<M; c++){
        for(int r=1; r<N; r++){
            datas[r][c] += datas[r-1][c];
        }
    }
    
    int answer = 0;
    for(int r =0 ;r<N; r++){
        for(int c =0; c<M; c++){
            if(board[r][c] + datas[r][c]>0) answer++;
        }
    }    
    
    return answer;
}

/*

각 r에 모든 공사 시작지점 c1, c2, deg 넣고 -> 25만
r 개수는 1000개
각 r별로 공사지점을 O(n)에 알 수 있을까?
공사 시작 지점 + degree / 공사 끝 지점 + degree를 r에 넣음 : 25만
'현재 더하는 값'을 둠.
공사 시작 지점을 만나면 '현재 더하는 값' + degree
공사 끝 지점을 만나면 '현재 더하는 값' - degree
이렇게 풀면 1차원 누적 합임.
이래도 O(NK)라 시간초과 -> 2차원 누적합이 필요.


*/

'PS > PS Log' 카테고리의 다른 글

22.06.12. 풀었던 문제들  (0) 2022.06.23
22.06.11. 풀었던 문제들  (0) 2022.06.23
22.06.09. 풀었던 문제들  (0) 2022.06.23
22.06.08. 풀었던 문제들  (0) 2022.06.23
22.06.07. 풀었던 문제들  (0) 2022.06.23
    hyelie
    hyelie

    티스토리툴바