[C++/ํ๋ก๊ทธ๋๋จธ์ค] ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ
๋ฌธ์
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;
}