Hello Ocean! ๐ŸŒผ

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ ๋ณธ๋ฌธ

Algorithm

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํŒŒ๊ดด๋˜์ง€ ์•Š์€ ๊ฑด๋ฌผ

bba_dda 2022. 3. 1. 21:20
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

๋ฌธ์ œ๊ฐ€ ๊ธธ๋‹ค.. 

์š”์•ฝํ•˜๋ฉด, 

 

NxM์˜ ์ดˆ๊ธฐ borad์—์„œ (r1, c1) ~(r2, c2)์˜ ์ž„์˜์˜ ๊ตฌ๊ฐ„?๋ถ€๋ถ„์„ ๊ณต๊ฒฉ(-)ํ–ˆ๋‹ค๊ฐ€ ํšŒ๋ณต(+)ํ–ˆ๋‹ค๊ฐ€ ํ•˜๋ฉด์„œ 

์ตœ์ข…์ ์œผ๋กœ ๊ฐ’์ด 0๋ณด๋‹ค ํฐ ์นธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํ’€์ด

์ง€๋‚œ์ฃผ ์Šคํ„ฐ๋””์‹œ๊ฐ„์— ๋“ค์—ˆ๋˜ IMOS๋ฒ•์„ ์ด์šฉํ•ด๋ณด์•˜๋‹ค.

IMOS๋ฒ•์ด๋ž€? <- ์ด ๋ธ”๋กœ๊ทธ์— ์•„์ฃผ ์„ค๋ช…์ด ์ž˜ ๋˜์–ด ์žˆ๋‹ค.

 

N+1 x M+1 ํฌ๊ธฐ์˜ cache๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ imos๋ฒ•์„ ์ด์šฉํ•ด ๊ณต๊ฒฉ, ํšŒ๋ณต ๋กœ๊ทธ?๋ฅผ ๊ธฐ๋กํ•˜๊ณ 

๋งจ ๋งˆ์ง€๋ง‰์— ๊ฐ€๋กœ๋กœ ํ•œ๋ฒˆ, ์„ธ๋กœ๋กœ ํ•œ๋ฒˆ ์ญ‰ ํ›‘์–ด ์ตœ์ข…์ ์ธ cache๋ฐฐ์—ด ๊ฐ’์„ ๊ตฌํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ , cache[r][c] + board[r][c] > 0 ์ธ ์นธ๋“ค์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ด๋Ÿฐ ๋Š๋‚Œ์˜ (์™„์ „ํƒ์ƒ‰์œผ๋กœํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๋‚ ๊ฑฐ๊ฐ™์€) ๋ฌธ์ œ๋ฅผ ๊ทธ๋™์•ˆ ๋งค์šฐ ์–ด๋ ค์›Œํ–ˆ๋Š”๋ฐ, imos๋ฒ•์„ ์•Œ๊ฒŒ๋˜์—ˆ์œผ๋‹ˆ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ๋Š˜์–ด๋‚  ๊ฒƒ ๊ฐ™๋‹ค.

 

* imos๋ฅผ ์•„์ด๋ชจ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, ์ด๋ชจ์Šค๋ผ๊ณ  ์ฝ๋Š” ๊ฒƒ ๊ฐ™๋‹ค (์ผ๋ณธ์–ด์ธ๋“ฏ?)

์ฝ”๋“œ

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> cache;
int solution(vector<vector<int>> board, vector<vector<int>> skill) {
    int answer = 0;
    int N = board.size();
    int M = board[0].size();
    cache = vector<vector<int>>(N+1, vector<int>(M+1, 0)); // imos์œ„ํ•ด ํ•˜๋‚˜์”ฉ ํฌ๊ฒŒ ๋งŒ๋“ค๊ธฐ
    for (auto s: skill) {
        int degree = s[5];
        int r1 = s[1]; int c1 = s[2];
        int r2 = s[3]; int c2 = s[4];
        if (s[0] == 2) { // ๊ณต๊ฒฉ
            cache[r1][c1] += degree;
            cache[r1][c2+1] -= degree;
            cache[r2+1][c1] -= degree;
            cache[r2+1][c2+1] += degree;
        } else { // ํšŒ๋ณต
            cache[r1][c1] -= degree;
            cache[r1][c2+1] += degree;
            cache[r2+1][c1] += degree;
            cache[r2+1][c2+1] -= degree;
        }
    }
    // ๊ฐ€๋กœ๋กœ ํœฉ์“ธ๊ธฐ
    for (int r=0;r<N;r++) {
        int sum = cache[r][0];
        for (int c=1;c<M;c++) {
            cache[r][c] += sum;
            sum = cache[r][c];
        }
    }
    // ์„ธ๋กœ๋กœ ํœฉ์“ธ๊ธฐ
    for (int c=0;c<M;c++) {
        int sum = cache[0][c];
        for (int r=1;r<N;r++) {
            cache[r][c] += sum;
            sum = cache[r][c];
        }
    }
    
    for (int r=0;r<N;r++) {
        for (int c=0;c<M;c++) {
            if (cache[r][c] + board[r][c] > 0) answer++;
        }
    }
    return answer;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•