KoreanFoodie's Study
SW 역량테스트 - [백준] 연구소 문제 풀이/해답/코드 (C++ / JAVA) 본문
Data Structures, Algorithm/SW 역량테스트
SW 역량테스트 - [백준] 연구소 문제 풀이/해답/코드 (C++ / JAVA)
GoldGiver 2020. 9. 29. 11:27
SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!
해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다.
코드에 대한 설명은 주석을 참고해 주세요 :)
문제 링크 : www.acmicpc.net/problem/14502
해답 코드 :
// c++
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int dx[] = { 0,0,-1,1 };
int dy[] = { -1,1,0,0 };
int inputMap[8][8];
int tempMap[8][8];
int n, m;
int ans = 0;
//지도 복사
void copyMap(int a[8][8], int b[8][8]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
a[i][j] = b[i][j];
}
}
}
//바이러스 퍼트리기(BFS)
void BFSforVirus() {
//AfterSpreadMap은 3개의 벽을 세운 후 바이러스가 퍼졌을 때의 연구소의 상황을 저장하는곳.
int AfterSpreadMap[8][8];
copyMap(AfterSpreadMap, tempMap);
queue<pair<int, int>> q;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (AfterSpreadMap[i][j] == 2)
q.push(make_pair(i, j));
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int newX = x + dx[i];
int newY = y + dy[i];
// 감염되지 않은 영역만 선택
if (0 <= newX && newX<n && 0 <= newY && newY<m) {
if (AfterSpreadMap[newX][newY] == 0) {
AfterSpreadMap[newX][newY] = 2;
q.push(make_pair(newX, newY));
}
}
}
}
//연구소에 오염되지 않은 부분 체크.
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (AfterSpreadMap[i][j] == 0)
cnt++;
}
}
ans = max(ans, cnt);
}
// 벽을 세우는 재귀 함수
void recursiveWall(int cnt) {
// 종료 부, 바이러스를 퍼트려서 오염되지 않은 부분의 갯수를 확인한다.
if (cnt == 3) {
BFSforVirus();
return;
}
//벽 세우는 부분.
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (tempMap[i][j] == 0) {
tempMap[i][j] = 1; // 해결 부, 실제로 벽을 세우는 부분
recursiveWall(cnt + 1); // 분할 부, cnt를 ++ 시켜 벽을 세워야하는 갯수를 -1 시키면서 문제를 분할.
tempMap[i][j] = 0;
}
}
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &inputMap[i][j]);
}
}
//연구소에서 0인 부분을 모두 벽을 세워야 하므로 다음과 같이 진행.
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (inputMap[i][j] == 0) {
copyMap(tempMap, inputMap);
tempMap[i][j] = 1;
recursiveWall(1);
tempMap[i][j] = 0;
}
}
}
printf("%d\n", ans);
return 0;
}
// java
import java.util.ArrayList;
import java.util.Scanner;
class pos {
int x;
int y;
pos(int i, int j) {
x = i;
y = j;
}
}
class Main {
static int area = 0;
static int N, M, V;
static void build_wall(int[][] map, int x, int y, int cnt, ArrayList<pos> virus) {
// restore original map after spreading virus
if (cnt == 3) {
int[][] temp = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
temp[i][j] = map[i][j];
}
}
spread_v(map, virus);
area = Math.max(area, count_zero(map));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
map[i][j] = temp[i][j];
}
}
return;
}
int j = y;
for (int i = x; i < N; i++, j = 0) {
for (; j < M; j++) {
if (map[i][j] == 0) {
map[i][j] = 1;
build_wall(map, i, j+1, cnt+1, virus);
map[i][j] = 0;
}
}
}
}
static void spread_v(int[][] map, ArrayList<pos> virus) {
// when spread is over, call count_zero
// BFS, add to myQ
ArrayList<pos> myQ = new ArrayList<>();
for (int i = 0; i < virus.size(); i++) {
pos temp = virus.get(i);
int x = temp.x;
int y = temp.y;
if (x+1 < N && map[x+1][y] == 0) {
map[x+1][y] = 2;
myQ.add(new pos(x+1, y));
}
if (y+1 < M && map[x][y+1] == 0) {
map[x][y+1] = 2;
myQ.add(new pos(x, y+1));
}
if (x-1 >= 0 && map[x-1][y] == 0) {
map[x-1][y] = 2;
myQ.add(new pos(x-1, y));
}
if (y-1 >= 0 && map[x][y-1] == 0) {
map[x][y-1] = 2;
myQ.add(new pos(x, y-1));
}
}
while (!myQ.isEmpty()) {
spread_v(map, myQ);
myQ.remove(0);
}
/*
// Nowhere else to spread the virus
if (virus.isEmpty()) {
area = Math.max(area, count_zero(map));
} else {
spread_v(map, virus);
}
*/
}
static int count_zero(int[][] map) {
int zero = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 0) zero++;
}
}
return zero;
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
int[][] map = new int[N][M];
ArrayList<pos> virus = new ArrayList<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
map[i][j] = sc.nextInt();
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 2) {
virus.add(new pos(i, j));
}
}
}
build_wall(map, 0, 0, 0, virus);
System.out.println(area);
sc.close();
}
}
SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)
SW 역량테스트 준비 - C++ 코드, Java 코드
SW 역량테스트 준비 - 백준 알고리즘 문제
'Data Structures, Algorithm > SW 역량테스트' 카테고리의 다른 글
SW 역량테스트 - [백준] 영역 구하기 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.09.29 |
---|---|
SW 역량테스트 - [모의 SW 역량테스트] 홈 방범 서비스 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.09.29 |
SW 역량테스트 - [모의 SW 역량테스트] 등산로 조성 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.09.29 |
SW 역량테스트 - [모의 SW 역량테스트] 벌꿀채취 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.09.29 |
SW 역량테스트 - [백준] 치킨 배달 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.09.29 |
Comments