보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈때 중성화된 동물'을 찾는 문제이다.
키 값으로 INNER JOIN을 한뒤 ANIMAL_INS에서는 Intact로 시작하고, ANIMAL_OUTS에서는 Spayed나 Neutered로 시작하는 데이터를 찾으면 된다.
소스코드
SELECT A.ANIMAL_ID
,A.ANIMAL_TYPE
,A.NAME
FROM ANIMAL_INS A
,ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
AND A.ANIMAL_TYPE = B.ANIMAL_TYPE
AND A.SEX_UPON_INTAKE LIKE 'Intact%'
AND (B.SEX_UPON_OUTCOME LIKE 'Neutered%' OR B.SEX_UPON_OUTCOME LIKE 'Spayed%')
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
bool flag;
int n, l, r, ans;
int dy[] = { 0, -1, 0, 1 };
int dx[] = { 1, 0, -1, 0 };
int map[50][50];
bool visit[50][50];
vector<pair<int, int> > v;
void init() {
cin >> n >> l >> r;
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
cin >> map[y][x];
}
}
}
void bfs(int y, int x) {
int count = 1, sum = map[y][x];
queue<pair<int, int> > q;
q.push(make_pair(y, x));
v.push_back(make_pair(y, x));
visit[y][x] = 1;
while (!q.empty()) {
int y = q.front().first;
int x = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || nx < 0 || ny >= n || nx >= n || visit[ny][nx]) continue;
int diff = abs(map[y][x] - map[ny][nx]);
if (diff >= l && diff <= r) {
visit[ny][nx] = 1;
sum += map[ny][nx];
count++;
q.push(make_pair(ny, nx));
v.push_back(make_pair(ny, nx));
}
}
}
if (v.size() > 1) {
flag = 1;
int updateValue = sum / count;
for (int i = 0; i < v.size(); i++) map[v[i].first][v[i].second] = updateValue;
}
v.clear();
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
init();
while (true) {
memset(visit, 0, sizeof(visit));
flag = 0;
for (int y = 0; y < n; y++) {
for (int x = 0; x < n; x++) {
if (visit[y][x]) continue;
bfs(y, x);
}
}
if (flag) ans++;
else break;
}
cout << ans << "\n";
return 0;
}
그냥 진짜 구현하는 문제다. 빡구현까지는 아니고 배열 조정을 하느라 약간 머리가 아픈 문제
문제에 나온대로 확산과 공기청정기 순환 2가지로 나눠서 구현하면 된다.
spreadDust() 메서드
확산은 tempMap배열을 이용해 구현했다. 확산은 queue를 이용해도 될것같다.
확산과 같은 경우 인접한 공간에 숫자가 있는경우 어떻게 처리하는지가 중요하다. 한 공간(y, x)를 기준으로 인접한 공간에 값이 없다면 그냥 4방향으로 확산시켜주면 되지만, 한 방향이라도 있는 경우 다음 탐색을 할때 영향을 주기 때문이다. 즉, 우리는 순차적으로 한 공간(y, x)에 대해 확산시키는 소스를 구현하지만 문제는 한순간에 확산하기 때문에 영향을 받기전의 값으로 확산을 시켜야 한다.
1. map을 tempMap에 복사하여 원래의 미세먼지 값들을 저장.
2. 확산될 먼지의 양은 원본map을 통해 계산
3. tempMap에서 먼지를 확산시킴
4. tempMap에서 확산시킨 것들 다시 map으로 옮김.
activateAirCleaner() 메서드
이 부분은 공기청정기를 작동시키는 메서드이다. 기존 입력을 받을때 따로 list에 저장해둔 공기청정기의 y좌표를 이용해 map배열의 값을 옮겨주면 된다. 공기청정기에 들어가는 먼지는 없어진다는 조건을 활용해서 없어지는 좌측부터 하나씩 값을 옮겨주었다. 여기서 주의할 점은 공기청정기가 위치한 y좌표의 x축을 이동시킬때 모두 이동시키고공기청정기 다음x좌표를 0으로 다시 갱신해줘야 한다는 것이다.