알고리즘/프로그래머스
2022 카카오 블라인드 코딩테스트 6번
내이름은 킹햄찌
2022. 2. 5. 11:00
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
2022 카카오 블라인드 코딩테스트 6번
작년에 인턴쉽문제를 풀었을때 누적합 문제가 있어서 조금 깊게 공부했는데
누적합의 확장인 imos법이라는게 있었음
시간복잡도도 좋고, 풀이법도 간단하여 기억하고 있었는데 딱 적용시킬 수 있는 문제라고 생각됨
아래 참고
https://imoz.jp/algorithms/imos_method.html
いもす法
図 2: モンスターが現れる矩形(赤色)と, 各タイルで現れるモンスターの種類の数
imoz.jp
#include <string>
#include <vector>
#define MAX 1004
using namespace std;
int arr[MAX][MAX];
int max(int a, int b) {
return a > b ? a : b;
}
int imos(vector<vector<int>> board, vector<vector<int>> skill) {
//set damage
for (auto index : skill) {
//index[0] = type
//index[1] = fy
//index[2] = fx
//index[3] = sy
//index[4] = sx
//index[5] = damage
int type = 1;
if (index[0] == 1)
type *= (-1);
arr[index[1]][index[2]] += index[5] * type;
arr[index[3] + 1][index[4] + 1] += index[5] * type;
arr[index[1]][index[4] + 1] -= index[5] * type;
arr[index[3] + 1][index[2]] -= index[5] * type;
}
//damage 배열 계산
for (int i = 1; i < board.size(); i++) {
for (int j = 0; j < board[i].size(); j++) {
arr[i][j] += arr[i - 1][j];
}
}
for (int i = 0; i < board.size(); i++) {
for (int j = 1; j < board[i].size(); j++) {
arr[i][j] += arr[i][j - 1];
}
}
//기존 건물값에 damage 계산
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[i].size(); j++) {
arr[i][j] += board[i][j];
}
}
//파괴된 건물 계산
int cnt = 0;
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[i].size(); j++) {
if (arr[i][j] >0)
cnt++;
}
}
return cnt;
}
int solution(vector<vector<int>> board, vector<vector<int>> skill) {
int answer = imos(board, skill);
return answer;
}
아이디어
imos알고리즘을 그대로 사용했음