๋ฌธ์ ์์ฝ
๋ฒ์์ degree๊ฐ ์ฃผ์ด์ง๋ฉด type์ ๋ฐ๋ผ ๊ฑด๋ฌผ์ด ํ๊ดด๋๊ฑฐ๋ ํ๋ณต๋๋ค. ์ต์ข ์ ์ผ๋ก ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋๋ฅผ ํ์ ํ์ฌ ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ์ ์๋ฅผ ๋ฐํํ๋ผ.
[๋ฌธ์ ์ค๋ช ]
- N x M ํฌ๊ธฐ์ ํ๋ ฌ ๋ชจ์ ๋งต์ด ์๋ค.
- ๋ด๊ตฌ๋๋ฅผ ๊ฐ์ง ๊ฑด๋ฌผ์ด ๊ฐ ์นธ๋ง๋ค ์กด์ฌํ๋ค.
- type์ด 1์ด๋ฉด degree ๋งํผ ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋๊ฐ ๊ฐ์ํ๊ณ , type์ด 2์ด๋ฉด degree ๋งํผ ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋๊ฐ ํ๋ณตํ๋ค.
- ์ต์ข
์ ์ผ๋ก ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋๊ฐ 0์ดํ์ด๋ฉด ๊ฑด๋ฌผ์ ํ๊ดด๋๋ค.
- ์ค๊ฐ์ ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋๊ฐ 0์ดํ์ผ์ง๋ผ๋ ๊ณต๊ฒฉ์ ๋ฐ์ผ๋ฉด ๋ด๊ตฌ๋๋ ๊ณ์ ๊ฐ์ํ๋ค.
- ์ฆ, ์ต์ข ๊ฐ์ ๊ทผ๊ฑฐ๋ก ๊ฑด๋ฌผ์ ํ๊ดด๋๋ค.
[์ ํ ์ฌํญ]
- board(N x M): ๊ฑด๋ฌผ์ ๋งต(ํ๊ณผ ์ด) (1 ≤ ๊ฑด๋ฌผ์ ํ(N) or ๊ฑด๋ฌผ์ ์ด(M) ≤ 1,000, 1 ≤ ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋ ≤ 1,000)
- skill: type, ๋ฒ์, ๊ณต๊ฒฉ or ํ๋ณต ํฌ๊ธฐ(degree) (1 ≤ skill ๋ฐฐ์ด ํฌ๊ธฐ ≤ 250,000, 1 ≤ degree ≤ 500)
board | skill | result |
[[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 |
๋ฌธ์ ์ ๊ทผ
- imos ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ (์ ์
์ถ๋ ฅ์๋ฅผ ๊ฐ์ง๊ณ ์ค๋ช
)
- ๋์ ํฉ ์ด์ฉ
// 22. 06. 29. ์ - ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ - imos algorithm
public class Solution {
public static void main(String[] args) {
System.out.println(solution(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
, new int[][]{{1, 1, 1, 2, 2, 4}, {1, 0, 0, 1, 1, 2}, {2, 2, 0, 2, 0, 100}}));
}
public static int solution(int[][] board, int[][] skill) {
int answer = 0;
int N = board.length;
int M = board[0].length;
// 1. ๋์ ํฉ์ ๋ณด๊ดํ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
int[][] cumulative_map = new int[N+1][M+1];
// 2. skill ๋ฐฐ์ด ๊ฐ์ ์ฝ์ผ๋ฉฐ ๋์ ํฉ ๊ณ์ฐ์ ์ํด ๋ฒ์์ ์์๊ณผ ๋์ degree ๊ฐ ์ธํ
ํ๊ธฐ
for(int i = 0, length = skill.length; i < length; i++) {
int type = skill[i][0];
int r1 = skill[i][1];
int c1 = skill[i][2];
int r2 = skill[i][3];
int c2 = skill[i][4];
int degree = type == 1 ? skill[i][5] * -1 : skill[i][5];
cumulative_map[r1][c1] += degree;
cumulative_map[r1][c2+1] += degree * -1;
cumulative_map[r2+1][c1] += degree * -1;
cumulative_map[r2+1][c2+1] += degree;
}
// 2. ์ธํ
๋ degree ๊ฐ ์ด์ฉํ์ฌ ๋์ ํฉ ํด์ฃผ๊ธฐ - ํ
for(int r = 0; r <= N; r++) {
int prior = cumulative_map[r][0];
for(int c = 1; c <= M; c++) {
cumulative_map[r][c] += prior;
prior = cumulative_map[r][c];
}
}
// ์ด
for(int c = 0; c <= M; c++) {
int prior = cumulative_map[0][c];
for(int r = 1; r <= N; r++) {
cumulative_map[r][c] += prior;
prior = cumulative_map[r][c];
}
}
// ์๋ ๋ฐฐ์ด๊ณผ ๋ํด์ฃผ๊ธฐ
for(int r = 0; r < N; r++) {
for(int c = 0; c < M; c++) {
board[r][c] += cumulative_map[r][c];
if(board[r][c] > 0) answer++;
}
}
return answer;
}
}
๋๋์
'ํ๊ดด๋์ง ์์ ๊ฑด๋ฌผ'์ ๊ฒฝ์ฐ 2์ฐจ์ ๋ฐฐ์ด์ ์ผ์ผ์ด ๋ฐฉ๋ฌธํ์ฌ ๊ฑด๋ฌผ์ ๋ด๊ตฌ๋๋ฅผ ๋ํ๊ณ ๋นผ์ค๋ค๋ฉด ๋ถ๋ช ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด ๋ถ๋ช ํ๊ธฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํ๋ค. ๊ณต๋ถํ ๊ฒฐ๊ณผ imos ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ํด๊ฒฐํ๋ ๋ฌธ์ ์๋ค. imos ์๊ณ ๋ฆฌ์ฆ์ ๋์ ํฉ์ ๊ฐ๋ ์ ํ์ฉํ ๊ฐ๋ ์ด๋ค. ๊ธฐ์กด์ ์๊ณ ์๋ ๋์ ํฉ์ด๋, 1์ฐจ์ ๋ฐฐ์ด์ด ์์ ๋ ๋ฐฐ์ด์ ์ ์ฒด ํฉ์ ๋ํ ๊ฒ์์ ๊ตฌํ๊ณ ์ ํ๋ ๋ฒ์๋ฅผ ์ ์ธํ ์นธ์ ํฉ์ ๋ํ ๊ฐ์ ๋นผ์ฃผ๋ ๋ฐฉ์์ด์๋ค. ๋ฐ๋ฉด, imos ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฐ์ด์ ๋ฒ์๊ฐ ์ฃผ์ด์ก์ ๋, ๋งค ๋ฒ ๋์ ํฉ์ ํด์ฃผ๋ ๊ฒ์ด ์๋๋ผ 4์นธ์ ๋์ ํ ๊ฐ์ ๋ํ๊ฑฐ๋ ๋นผ์ฃผ์ด ๋ง์ง๋ง์ ์ ์ฒด์ ์ผ๋ก ๋์ ํฉ์ ๊ตฌํ๋ ๋ฐฉ์์ธ ๊ฒ์ด๋ค. ๋๋ถ์ O(N * M * skill์ ๊ฐ์)์์ O(N * M + skill)๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ๋๋ ์ฃผ์ด ํจ์จ์ฑ ๊ฒ์ฆ์ ํต๊ณผํ ์ ์์๋ค. ๊ผญ ๊ธฐ์ตํ์ฌ ๋ค์ ๋ฒ์๋ ํ์ฉํ ์ ์๋๋ก ํ์.
๋ฌธ์ ๋งํฌ: 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
'Algorithm > Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Kakao 2022 Blind Test - Lv3. ์๊ณผ ๋๋ (Java) (0) | 2022.06.25 |
---|---|
Kakao 2022 Blind Test - Lv2. ์๊ถ๋ํ (Java) (0) | 2022.06.11 |
Kakao 2022 Blind Test - Lv2. k์ง์์์ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ (Java) (0) | 2022.06.04 |
Kakao 2021 Blind Test - Lv3. ๊ด๊ณ ์ฝ์ (Java) (0) | 2022.06.02 |
Kakao 2021 Blind Test - Lv3. ํฉ์น ํ์ ์๊ธ (Java) (0) | 2022.06.02 |
๋๊ธ