📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 누적합 (시간 복잡도 : O(N+M) = O(N))
필요 자료구조
- 모든 skills에 대한 처리를 저장할 누적합 2차원 배열 💥
1. 반복문으로 스킬 배열을 돌며 새로 생성한 누적합 배열에 degree를 배치한다.
2. 가로 누적합과 세로 누적합을 구한다.
3. 건물 배열과 누적합 배열의 값을 더한 값이 0보다 크다면 붕괴되지 않은 건물이므로 정답 +1한다.
💥 유의사항
- O(N * M * K)했다간 시간 초과가 발생한다. 그래서 누적합으로 해결
- N+1, M+1까지 계산 가능해야 하므로 기존 board 배열의 크기보다 행과 열 크기를 1씩 크게 잡아줘야 한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import java.util.*;
class Solution {
static int[][] board, skill, sum;
static int N, M;
public int solution(int[][] board, int[][] skill) {
this.board = board;
this.skill = skill;
N = board.length;
M = board[0].length;
sum = new int[N+1][M+1];
for(int[] s : skill) {
int type = s[0];
int r1 = s[1]; int c1 = s[2];
int r2 = s[3]; int c2 = s[4];
int degree = s[5];
if(type == 1) { // 적군
sum[r1][c1] -= degree;
sum[r1][c2 + 1] += degree;
sum[r2 + 1][c1] += degree;
sum[r2 + 1][c2 + 1] -= degree;
}
else { // 아군
sum[r1][c1] += degree;
sum[r1][c2 + 1] -= degree;
sum[r2 + 1][c1] -= degree;
sum[r2 + 1][c2 + 1] += degree;
}
}
calc();
// 파괴되지 않은 건물 찾기
int answer = 0;
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < M ; j++) {
if(sum[i][j] + board[i][j] > 0)
answer++;
}
}
return answer;
}
// 누적합 계산 메서드
private static void calc() {
// 가로 누적합 구하기 (왼쪽 → 오른쪽)
for(int i = 0 ; i <= N ; i++) {
for(int j = 0 ; j < M ; j++)
sum[i][j + 1] += sum[i][j];
}
// 세로 누적합 구하기 (위 → 아래)
for(int i = 0 ; i <= M ; i++) {
for(int j = 0 ; j < N ; j++)
sum[j + 1][i] += sum[j][i];
}
}
}
|
cs |
💦 어려웠던 점
- 브루트포스로 풀었더니 효율성은 모두 틀렸다...😅
틀린 코드 확인하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import java.util.*;
class Solution {
static int[][] board, skill;
static int N, M;
public int solution(int[][] board, int[][] skill) {
this.board = board;
this.skill = skill;
N = board.length;
M = board[0].length;
for(int i = 0 ; i < skill.length ; i++) { // 25만 * 1만 = 25 * 10^8 => 시간 초과
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 = skill[i][5];
if(type == 1) { // 적군
for(int a = r1 ; a <= r2 ; a++) {
for(int b = c1 ; b <= c2 ; b++) {
board[a][b] -= degree;
}
}
}
else { // 아군
for(int a = r1 ; a <= r2 ; a++) {
for(int b = c1 ; b <= c2 ; b++) {
board[a][b] += degree;
}
}
}
}
int answer = 0; // 파괴되지 않은 건물 수
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < M ; j++) {
if(board[i][j] > 0)
answer++;
}
}
return answer;
}
}
|
cs |
- 그럼 혹시 누적합..? 했는데 누적합 문제였다고 한다.. (누적합인 거 알아채고도 풀이는 쉽게 생각이 나지 않았음)
🧐 새로 알게 된 내용
- 2차원 누적합 구하는 방법
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ 누적합 관련 최고의 설명!!!!!
왜 좌우 n, -n 이렇게 진행되는지 몰랐는데 여기서 잘 정리해주신 덕에 이해할 수 있었다..
[Java/C++] 프로그래머스 Level 3 - 파괴되지 않는 건물
문제 링크 https://school.programmers.co.kr/learn/courses/30/lessons/92344#qna 알고리즘 스터디 끝나니까 자연스럽게 알고리즘을 안 풀게 되네.. 하루에 하나는 아니더라도 주 3회 정도는 꾸준히 풀어야 하는데,
howudong.tistory.com
✔ 친절한 그림 설명...
[프로그래머스] 파괴되지 않은 건물
2022 KAKAO BLIND RECRUITMENT 파괴되지 않은 건물 링크 : https://programmers.co.kr/learn/courses/30/lessons/92344 사용 언어 : JAVA 문제 설명 N x M 크기의 행렬 모양의 게임 맵에는 내구도를 가진 건물이 각 칸마다 하
yamyam-spaghetti.tistory.com
2022 KAKAO BLIND RECRUITMENT - 파괴되지 않은 건물 (JAVA)
❓ 문제 - 2022 KAKAO BLIND RECRUITMENT 파괴되지 않은 건물 - JAVA 풀이법 출처 (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]] [[
developer-ellen.tistory.com
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Level2] 디펜스 게임 (JAVA) (0) | 2024.03.11 |
---|---|
[프로그래머스/Level3] 입국 심사 (JAVA) (0) | 2024.03.11 |
[프로그래머스/Level3] 보석 쇼핑 (JAVA) (0) | 2024.03.08 |
[프로그래머스/Level3] 징검다리 건너기 (JAVA) (0) | 2024.03.08 |
[프로그래머스/Level3] 모두 0으로 만들기 (JAVA) (0) | 2024.03.06 |