중간중간에 테스트 코드를 통해서 올바르게 진행 되는지 확인하면 더 어려운 문제가 나오더라도 당황하지 않고 푸실 수 있을겁니다!
혹시 bfs 구현이 어렵다면 쉬운 bfs 문제들 풀어보시면 그냥 bfs 코드자체에 익숙해지셔야 합니다.
아래는 정답코드입니다.
#include <iostream>
#include <queue>
using namespace std;
int result = 0;
int result2 = 0;
int n, m;
bool arr[101][101] = { 0, };
int y_ar[4] = { 0,0,1,-1 };
int x_ar[4] = { 1,-1,0,0 };
int solved(){
//0. init
bool jud = false;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (arr[i][j] == 1)
jud = true;
if (jud == false)
return 1;
//1. bfs
bool visited[101][101] = { 0, };
queue <pair <int, int>> que;
que.push(make_pair(1, 1));
visited[1][1] = 1;
while (!que.empty()) {
int cy = que.front().first;
int cx = que.front().second;
que.pop();
for (int i = 0; i < 4; i++) {
int ny = cy + y_ar[i];
int nx = cx + x_ar[i];
if (ny >= 1 && ny <= n && nx >= 1 && nx <= m)
if (arr[ny][nx] == 0 && visited[ny][nx] == 0) {
que.push(make_pair(ny, nx));
visited[ny][nx] = 1;
}
}
}
//2. 닿는 곳 찾아 없애기
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (arr[i][j] == 1) {
for (int u = 0; u < 4; u++) {
int ad_y = i + y_ar[u];
int ad_x = j + x_ar[u];
if (visited[ad_y][ad_x] == 1) {
arr[i][j] = 0;
break;
}
}
}
//3. 최근 갯수
int cnt = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (arr[i][j] == 1)
cnt++;
if(cnt!=0)
result2 = cnt;
result++;
/*
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cout << arr[i][j] << ' ';
cout << endl;
}*/
return 0;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
if (arr[i][j] == 1)
result2++;
}
while (1) {
if (solved() == 1)
break;
}
cout << result << endl;
cout << result2 << endl;
return 0;
}
select SEX_UPON_OUTCOME
from ANIMAL_OUTS
group by SEX_UPON_OUTCOME
아 그러면 4가지 경우를 고려해서 결과를 도출하면 되겠구나 해서 아래와 같이 작성했습니다.
-- 코드를 입력하세요
SELECT a.ANIMAL_ID, a.ANIMAL_TYPE, a.NAME
from ANIMAL_OUTS as a
inner join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where (b.SEX_UPON_INTAKE like 'Intact Male' and a.SEX_UPON_OUTCOME like 'Neutered Male' )
or (b.SEX_UPON_INTAKE like 'Intact Female' and a.SEX_UPON_OUTCOME like 'Spayed Female')
order by a.ANIMAL_ID
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
입양을 못 간 동물중에서 조회하는것이기 때문에 ANIMAL_INS 기준으로 조인이 이루어져야 합니다.
즉 INS 위치에 따라 left 와 right 중에서 선택해야합니다.
limit와 order by로 쉽게 구현했습니다.
아래는 정답코드입니다.
select b.NAME,b.DATETIME
from ANIMAL_OUTS as a
right outer join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where a.DATETIME is null
order by b.DATETIME asc
limit 3;
관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.
조인을 통해서 문제를 해결해야 합니다.
보호시작일과 입양일을 비교하면 되는 문제입니다.
어떤 조인을 선택해야할지 고민했는데 생각해보니 left, right, inner 전부 가능합니다.
두 교집합을 출력하는 문제이기 때문입니다.
아래는 2개의 정답 코드입니다.
-- 코드를 입력하세요
select a.ANIMAL_ID, a.NAME
from ANIMAL_OUTS as a
inner join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where a.DATETIME < b.DATETIME
order by b.DATETIME
-- 코드를 입력하세요
/*
SELECT
a.ANIMAL_ID,
a.NAME
FROM ANIMAL_OUTS AS a
LEFT OUTER JOIN ANIMAL_INS AS I ON I.ANIMAL_ID = a.ANIMAL_ID
WHERE I.datetime > a.datetime
ORDER BY I.datetime;
*/
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
조인을 통해서 문제를 해결해야 합니다.
입양기록만 있고 보호소 기록이 없는 상태이므로 ANIMAL_OUTS을 기준으로 조인 해주면 됩니다.
ANIMAL_OUTS 위치에 따라서 left 조인, right 조인 둘다 가능합니다. 외래키와 주키인 ANIMAL_ID를 통해서 연결하고 OUTS의 ID와 NAME 출력하면 되는 문제입니다.
아래는 2개의 정답 코드입니다.
select a.ANIMAL_ID, a.NAME
from ANIMAL_OUTS as a
left outer join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where b.ANIMAL_ID is null
order by a.ANIMAL_ID
select b.ANIMAL_ID, b.NAME
from ANIMAL_INS as a
right outer join ANIMAL_OUTS as b on a.ANIMAL_ID = b.ANIMAL_ID
where a.ANIMAL_ID is null