KoreanFoodie's Study
SW 역량테스트 - [백준] 인구 이동 문제 풀이/해답/코드 (C++ / JAVA) 본문
Data Structures, Algorithm/SW 역량테스트
SW 역량테스트 - [백준] 인구 이동 문제 풀이/해답/코드 (C++ / JAVA)
GoldGiver 2020. 10. 15. 23:45
SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!
해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다.
코드에 대한 설명은 주석을 참고해 주세요 :)
문제 링크 : www.acmicpc.net/problem/16234
해답 코드 :
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
typedef struct pos {
int row;
int col;
}pos;
typedef struct cell {
int row;
int col;
int val;
}cell;
int map[50][50];
bool bar[50][50][4];
bool merged[50][50];
// check whether people moved or not
bool move_flag;
// how many times people moved
int ans;
vector<pos> my_union;
vector<cell> update_cell;
// right, down, left, up
int dR[4] = {0, 1, 0, -1};
int dC[4] = {1, 0, -1, 0};
int N, L, R;
bool isRange(int r, int c) {
if (r < 0 || r >= N || c < 0 || c >= N) {
return false;
}
else return true;
}
bool lr(int x, int y) {
if ( (abs(x - y) >= L) && (abs(x - y) ) <= R) {
return true;
} else return false;
}
// using vector my_union, update population
// update ans += 1
// if vector is not empty, move_flag -> true
void merge() {
int newVal = 0;
int sum = 0;
cell temp;
if (my_union.size() <= 1) {
return;
}
else {
//ans++;
for (int i = 0; i < my_union.size(); i++) {
sum += map[my_union[i].row][my_union[i].col];
}
newVal = sum / my_union.size();
/*
for (int i = 0; i < my_union.size(); i++) {
map[my_union[i].row][my_union[i].col] = newVal;
}
*/
for (int i = 0; i < my_union.size(); i++) {
temp = { my_union[i].row , my_union[i].col, newVal};
update_cell.push_back(temp);
}
}
}
// make bar[50][50][4] array
// if there is no open bar, return -1
int make_bar() {
int flag = -1;
int n_r, n_c;
// check 4 end point
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int dir = 0; dir < 4; dir++) {
n_r = i + dR[dir];
n_c = j + dC[dir];
if (isRange(n_r, n_c) && lr(map[i][j], map[n_r][n_c])) {
bar[i][j][dir] = true;
flag = 0;
}
else {
bar[i][j][dir] = false;
}
}
}
}
return flag;
}
void dfs(int c_r, int c_c) {
int n_r, n_c;
pos t_pos;
if (merged[c_r][c_c]) {
return;
}
else {
merged[c_r][c_c] = true;
t_pos = {c_r, c_c};
my_union.push_back(t_pos);
for (int dir = 0; dir < 4; dir++) {
n_r = c_r + dR[dir];
n_c = c_c + dC[dir];
if (isRange(n_r, n_c) && bar[c_r][c_c][dir]) {
dfs(n_r, n_c);
}
}
}
}
// search through map using bar
// merge "union", up the 'merged' flag for each area
// if there is no open bar, return -1
int dfs_map() {
int flag = -1;
int n_r, n_c;
// If no union is made, return -1
if (make_bar() == -1) {
return -1;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
dfs(i, j);
merge();
my_union.clear();
}
}
// restore merged
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
merged[i][j] = false;
}
}
// update cells
for (int i = 0; i < update_cell.size(); i++) {
map[update_cell[i].row][update_cell[i].col] = update_cell[i].val;
}
update_cell.clear();
return 0;
}
int main() {
cin >> N >> L >> R;
// N is 1
if (N == 1) {
cout << 0 << endl;
return 0;
}
move_flag = false;
int temp_ans = 0;
ans = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
while (dfs_map() != -1) {
ans++;
}
cout << ans << endl;
}
SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)
SW 역량테스트 준비 - C++ 코드, Java 코드
SW 역량테스트 준비 - 백준 알고리즘 문제
'Data Structures, Algorithm > SW 역량테스트' 카테고리의 다른 글
SW 역량테스트 - [백준] 아기 상어 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
---|---|
SW 역량테스트 - [백준] 나무 재테크 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 큐빙 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 드래곤 커브 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
SW 역량테스트 - [백준] 감시 문제 풀이/해답/코드 (C++ / JAVA) (0) | 2020.10.15 |
Comments