-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
5-g0rnn #17
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ ํํ
๋ ์ข ์ด๋ ค์ด ๋ฌธ์ ์๋ค์...
(๋ณธ๊ฐ ๋๋ฒํ๋ก 2์๊ฐ ์ด์ ๊ณ ๋ฏผํ์ต๋๋ค.)
2์ฐจ์ ๋ฐฐ์ด ๊ณต๊ฐ์ด ์๊ฒ ์ ํ๋์ด ์๋ค๋ ๊ฑธ๋ณด๊ณ
๋น ๊ณต๊ฐ์ ๋ฒฝ์ผ๋ก 3๊ฐ ๋ง๋ค๊ณ (<--๋ธ๋ฃจํธํฌ์ค),
๋ฒฝ 3๊ฐ๋ฅผ ์ถ๊ฐํ 2์ฐจ์ ๋ฐฐ์ด์ ํ์ ํด์ผ๊ฒ ๋ค (<--BFS)๏ฟฝ
๊ทธ๋ฆฌ๊ณ ๊ฐ BFS์์๋ temp๊ฐ๋ค์ ์จ์ผ๊ฒ ๋ค ๋ผ๋ ๋ฐฉ๋ฒ ๊น์ง๋ ์๊ฐํด๋์ต๋๋ค.
๊ทผ๋ฐ DFS๋ก ๋ฒฝ 3๊ฐ๋ฅผ ๋ธ๋ฃจํธํฌ์ค ํ๋ ๊ฒ์ด ์ฝ๊ฒ ๋ ์ค๋ฅด์ง ์์๋ค์.
๊ท ํธ๋ ์ฝ๋ ์ฌ์ฉ ๋ดค๋๋ฐ ์ฅ ๋ณด์๋ง์ '์!' ํ๋ฉฐ ์ดํดํด๋ฒ๋ ธ์ต๋๋ค.
CPP CODE
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#define EMPTY 0
#define WALL 1
#define VIRUS 2
#define VISITED 3
using namespace std;
int N, M;
int safeZone = 0, virusZone = 0, maxSafeZone = 0;
vector<vector<int>> lab;
queue<pair<int, int>> q;
int offset[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
bool isMoveable(vector<vector<int>> &tempLab, int x, int y) {
return 0 <= x && x < M && 0 <= y && y < N && tempLab[y][x] == EMPTY;
}
void bfs() {
int cntVirus = 0;
vector<vector<int>> tempLab = lab;
queue<pair<int, int>> tempQ = q;
while (!tempQ.empty()) {
int y = tempQ.front().first;
int x = tempQ.front().second;
tempQ.pop();
cntVirus++;
for (int dir = 0; dir < 4; dir++) {
int y_ = y + offset[dir][0];
int x_ = x + offset[dir][1];
if (isMoveable(tempLab, x_, y_)) {
tempLab[y_][x_] = VISITED;
tempQ.push(make_pair(y_, x_));
}
}
}
maxSafeZone = max(maxSafeZone, safeZone - 3 - cntVirus + virusZone);
}
void dfs(int wall) {
if (wall == 3) {
bfs();
return;
}
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
if (lab[y][x] == EMPTY) {
lab[y][x] = WALL;
dfs(wall + 1);
lab[y][x] = EMPTY;
}
}
}
}
int main() {
// 1) input
cin >> N >> M;
int temp;
lab = vector<vector<int>>(N, vector<int>(M));
for (int y = 0; y < N; y++) {
for (int x = 0; x < M; x++) {
cin >> temp;
lab[y][x] = temp;
if (temp == VIRUS) {
q.push(make_pair(y, x));
virusZone++;
}
if (temp == EMPTY) safeZone++;
}
}
// 2) solution
dfs(0);
cout << maxSafeZone;
}
// ํ์์ ๋ชจ๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ๊ฒ์ฌํ๋ค. ๋ฐ๋ผ์ all_virus๋ฅผ ๋นผ๋ฉด ๊ธฐ์กด virus๋ฅผ ๋ค์ ๋ํด์ผํ๋ค. | ||
// ๋ฐ๋ผ์ empty์ ๊ฐ์ - ์ถ๊ฐํ wall๊ฐ์ - ๋ชจ๋ virus ์ + ๊ธฐ์กด virus ์ | ||
maxSafe = max(maxSafe, safe - 3 - all_virus + virus); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ฌ๊ธฐ๊ฐ ํต์ฌ์ธ ๋ฏ ํ๋ค์.
์ฃผ์ ์ค๋ช
์ด ์น์ ํด์ ์ฝ๊ฒ ์ดํดํ ์ ์์์ต๋๋ค. ๊ตฟ๊ตฟ๊ตฟ
for (int i = 0; i < n; i++) | ||
{ | ||
for (int j = 0; j < m; j++) | ||
{ | ||
cin >> lab[i][j]; | ||
if (lab[i][j] == VIRUS) | ||
{ | ||
q.push(make_pair(j, i)); // (x, y) ๊ผด๋ก ์ ์ฅ | ||
virus++; | ||
} | ||
if (lab[i][j] == EMPTY) | ||
safe++; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TMI: ์ ๋ ์ด๋ฐ ์ขํ๋ฌธ์ ํท๊ฐ๋ฆฌ์ง ์๊ธฐ ์ํด์ for๋ฌธ๋ y, x๋ก ๋๊ณ ํ๋๋ค. ์ข์์.
for (int i = 0; i < n; i++) | ||
{ | ||
for (int j = 0; j < m; j++) | ||
{ | ||
if (lab[i][j] == EMPTY) | ||
{ | ||
lab[i][j] = WALL; | ||
dfs(wall + 1); | ||
lab[i][j] = EMPTY; | ||
} | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์ฌ๊ธฐ์ ๋ฒฝ์ ์ธ์ฐ๊ณ dfs๋ฅผ ๋๋ฆฌ๊ณ ๋์ ๋ฒฝ์ ๋ค์ ์ ๊ฑฐํ๋ ์ด์ ๋ฅผ ํผ์ ์๊ฐํด๋ดค์ผ๋ฉด ์ดํดํ๊ธฐ ์ด๋ ค์ ์ ๊ฒ ๊ฐ์๋ฐ ์ ๋ฒ ๋ฏธํ
์์ ์ค๋ช
์ ์ ํด์ฃผ์
์ ์ฝ๊ฒ ์ดํดํ ์ ์์์ต๋๋ค.
์ด๋ฒ PR๋ ์๊ณ ๋ง์ผ์
จ์ต๋๋ค~
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BFS๋ฅผ ์ฌ์ฉํด ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ ์๋ ์นธ์ 0 -> 2๋ก, ํผ์ง์ง ์์ ์นธ์ ํ์ ์ถ๊ฐํ๋ virusํจ์,
๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๊ณ ๋ ์ ์์ ํ ์์ญ์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ countํจ์,
๋น ์นธ์์ ๋ฒฝ์ 3๊ฐ ์ธ์ธ ์ ์๋ ๋ชจ๋ ์กฐํฉ์ ์ฐพ์ ๊ฐ ์กฐํฉ์ ๋ํด ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ๋ค ์์ ์์ญ์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ maxSafeํจ์
์ด๋ ๊ฒ 3๊ฐ๋ฅผ ๋ง๋ค์ด ํ์ด๋ณด์์ต๋๋ค.
from collections import deque
# ๋ฐฉํฅ ์ ์ (์, ํ, ์ข, ์ฐ)
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
# ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ ํจ์
def spread_virus(lab, N, M):
visited = [[False] * M for _ in range(N)]
queue = deque()
# ๋ฐ์ด๋ฌ์ค ์์น๋ฅผ ํ์ ์ถ๊ฐ
for i in range(N):
for j in range(M):
if lab[i][j] == 2:
queue.append((i, j))
visited[i][j] = True
# BFS๋ก ๋ฐ์ด๋ฌ์ค ํผ์ง
while queue:
x, y = queue.popleft()
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny] and lab[nx][ny] == 0:
visited[nx][ny] = True
lab[nx][ny] = 2
queue.append((nx, ny))
# ์์ ์์ญ ํฌ๊ธฐ ๊ณ์ฐ
def count_safe_area(lab, N, M):
safe_area = 0
for i in range(N):
for j in range(M):
if lab[i][j] == 0:
safe_area += 1
return safe_area
# ๋ฒฝ 3๊ฐ๋ฅผ ์ธ์ด ๊ฒฝ์ฐ์ ์์ ์์ญ ํฌ๊ธฐ ์ต๋๊ฐ ๊ณ์ฐ
def get_max_safe_area(lab, N, M):
empty_spaces = []
# ๋น ๊ณต๊ฐ ์ฐพ๊ธฐ
for i in range(N):
for j in range(M):
if lab[i][j] == 0:
empty_spaces.append((i, j))
max_safe_area = 0
# ๋ฒฝ 3๊ฐ๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ์ ๋ชจ๋ ์กฐํฉ์ ์ฐพ์์
for i in range(len(empty_spaces)):
for j in range(i + 1, len(empty_spaces)):
for k in range(j + 1, len(empty_spaces)):
# ๋ฒฝ 3๊ฐ ์ค์น
new_lab = [row[:] for row in lab] # ์๋ณธ lab์ ๋ณต์ฌ
new_lab[empty_spaces[i][0]][empty_spaces[i][1]] = 1
new_lab[empty_spaces[j][0]][empty_spaces[j][1]] = 1
new_lab[empty_spaces[k][0]][empty_spaces[k][1]] = 1
# ๋ฐ์ด๋ฌ์ค ํผ์ง
spread_virus(new_lab, N, M)
# ์์ ์์ญ ํฌ๊ธฐ ๊ณ์ฐ
safe_area = count_safe_area(new_lab, N, M)
max_safe_area = max(max_safe_area, safe_area)
return max_safe_area
# ์
๋ ฅ ๋ฐ๊ธฐ
N, M = map(int, input().split())
lab = [list(map(int, input().split())) for _ in range(N)]
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(get_max_safe_area(lab, N, M))
๋ธ๋ฃจํธํฌ์ค๋ก ๊ฐ ๊ฒฝ์ฐ๋ง๋ค BFS๋ก ์์ ์์ญ์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ ๋๋ค.
๐ ๋ฌธ์ ๋งํฌ
์ฐ๊ตฌ์
๋ฌธ์ ๊ฐ ์ด๋ค ์ ํ์ธ์ง ์จ๊ธฐ๊ธฐ ์ํด ๋ฌธ์ ์ ์ด๋ฆ๋ง ์์ฑํ์์ต๋๋ค.
โ๏ธ ์์๋ ์๊ฐ
1h
โจ ์๋ ์ฝ๋
์์ ์๋์ฝ๋๋ ์ฝ๋์ ์ ๋ฐ์ ์ธ ํ๋ฆ์ ๋๋ค. ์๋ง ๋๋ฌด ์ถ์์ ์ธ ๋ด์ฉ์ด๋ผ ๊ตฌํํ๋๋ฐ์ ๋ณ ๋์์ด ์๋ ๋ฏํฉ๋๋ค.
ํ์ต์ ์ํด ๋ฌธ์ ๋ฅผ ์๋ํด๋ณด๊ณ ํด์ค์ ๋ด์ฃผ์ธ์ฉ!
์ด ๋ฌธ์ ๋ bfs์ dfs, ๋ฐฑ ํธ๋ ํน์ ์ฌ์ฉํ ๋ฌธ์ ์ ๋๋ค. ์ฝ๋์ ํ๋ฆ์ ๋ง๊ฒ dfs/๋ฐฑํธ๋ํน, bfs์์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๋ฒฝ ์ค์นํ๊ธฐ
์ ๋ ์ฌ๊ธฐ์ ๋งํ์ ๊ตฌ๊ธ๋งํ์ต๋๋ค. ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ์ฌ ๋ฒฝ์ ์ค์นํ๋๊ตฐ์.!
์ด๋ ์ถ์ํํ๋ฉด ์กฐ๊ธ ๋ ์ดํดํ๊ธฐ ์ฌ์์ง๋๋ค.
dfs๋ ์์ ๊ฐ์ด ๋๊ฐ์ง ์ผ์ ํฉ๋๋ค. ์ด์ ์ด๋ ๊ฒ ํจ์๋ฅผ ์ ํ์ผ๋ฉด dfs๋ผ๋ ํจ์๋ฅผ ๋ฏฟ์ด์ผํฉ๋๋ค.
for๋ฌธ ๋ด๋ถ์์ dfs๋ฅผ ํธ์ถํ๋ ์ด์ ๋ ๋ฒฝ์ 1๊ฐ์ฉ ์ค์นํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋งจ ์ if๋ฌธ์์๋ ๋ฒฝ์ ๋ชจ๋ ์ค์นํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ ์ผ์ํค๊ธฐ ์ํด bfs๋ผ๋ ํจ์๋ฅผ ์คํ์ํต๋๋ค.
๋ฐ์ด๋ฌ์ค ์ ์ผ ์ํค๊ธฐ
์ด๋ bfs๋ก ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ฑฐ์ ๋ชจ๋ bfs๋ ํ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํ๋ค๋ฉด bfs๋ ์ฌ์ค ์ด๋ ค์ด๊ฒ ์๋๋๋ค.
์ ๋ ฅ์ ๋ฐ์ ๋
if (lab[i][j] == VIRUS)
๋ก ๊ฒ์ฌํ๊ณ ๋ฐ์ด๋ฌ์ค ์นธ์ ํ์ ๋ฃ์ต๋๋ค. (ํด๋น๋ฌธ์ ์์๋ ์ข๋ฃ๊ฐ์ ๋ฃ๊ธฐ ์ํด pair๋ฅผ ์ฌ์ฉํ์ต๋๋ค.)ํ์ ์ ์ฒ๋ฆฌ(๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ์ฝ์ !)๊ฐ ๋ ํ์
while(!q.empty())
๋ฅผ ํตํด ํ๊ฐ ๋น ๋๊น์ง ๊ฒ์ฌํฉ๋๋ค. ์ด๊ฒ ๊ตญ๋ฃฐ์ ๋๋ค.๋ฐ๋ณต๋ฌธ ๋ด๋ถ์ ์ฒ์ ๋ค์ด์๋ค๋ฉด ๋ฐฉ๋ช ๋ก์ ์ ์ด์ผํฉ๋๋ค. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด ํ์์
๋ฌธ์ ๊ฐ ๋๋ ๊ฒ
์ pop์ ํตํด ์ ๊ฑฐํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์ ๊ฐ์ ๋ฃ๋ ๊ฒ๋ ํ์(๊ฒ์ฌ)ํ๊ณ ์ ํ๋ ํญ๋ชฉ์ ๋๊ฒ ์ ๊ฐํ๊ธฐ ์ํจ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ์ด ํ๋ฒ ์คํ๋๋ค๋ฉด ํด๋น ํญ๋ชฉ์ ํ์์ ์ ๊ฑฐํด์ผ๊ฒ ์ฃ ? ๐ ๋ฌผ๋ก ๋ง์ง๋ง์ ํด๋ ๋ฉ๋๋ค.์๋ฌดํผ ๋ฐฉ๋ช ๋ก์ ์์ฑํ๊ณ ๋๋ฉด ๊ฐ ๋ฐฉํฅ์ ๋ง๊ฒ ๊ฒ์ฌํด์ค๋๋ค.
์ ์ฝ๋๋ ๊ตญ๋ฃฐ์ ๋๋ค. ๊ฐ ๋ฐฉํฅ(dir์ ๋ฐฉํฅ์ ๋ปํจ)๋ง๋ค ์ด๋ํ ์ ์๋์ง ๊ฒ์ฌํ๊ณ ์ด๋ํ๋ฉด ๋ฉ๋๋ค.
๐ ์๋กญ๊ฒ ์๊ฒ๋ ๋ด์ฉ
๋ฐฑํธ๋ ํน์ ๋ณต์ตํ ์ ์์ด์ ์ข์์ต๋๋ค.
์ ๋ ์์ ํ ๊ตฌ์ญ์ ์ฒดํฌํ๊ธฐ ์ํด ์ฌ์น์ฐ์ฐ์ ์ฌ์ฉํ์๋๋ฐ ์ด์ค for๋ฌธ์ ํ์ฉํ์ฌ ์ผ์ผ์ด ๊ฒ์ฌํด๋ ๋ฉ๋๋ค!!
์ด ๋ฐฉ๋ฒ(์ค์ฒฉ for)์ด ๋ช ๋ฃํด์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ๋ ์ฌ์ธ๊ฒ๋๋ค!!