Notice
Recent Posts
Recent Comments
Link
Dev.baelanche
[백준 17144] 미세먼지 안녕! 본문
반응형
문제가 너무 길어 중략하겠다...
문제는 장황한데 로직 자체는 별거 없다.
삼성 SW 문제들은 기본 탐색 + 문제 해결/구현 조합으로 자주 나오는데
문제에 접근하는것 자체는 어렵지 않아 흥미가 붙는 느낌이다.
문제 진행은 다음과 같다.
1. BFS 로 1회 탐색하며 문제에서 요구하는 대로 미세먼지를 퍼트린다.
2. 공기청정기를 문제에서 요구하는 대로 작동시켜 미세먼지를 뒤로 민다.
3. 입력받은 시간만큼 반복한 후 미세먼지의 양을 출력한다.
미세먼지 확산은 확산 과정에서 합연산으로 먼지가 쌓이므로
먼저 BFS를 1회 마친 후 큐에 담겨있는 노드들을 빼내면서 배열을 다시 채워준다.
그리고 다음 BFS에 미세먼지의 위치들을 큐에 담아 진행한다.
이때 공기청정기의 위치도 잊지말고 채워준다.
공기청정기 순환은 특별한 알고리즘없이 시계방향, 반시계방향으로 인덱스를 밀어주었다.
어떻게하면 깔끔하게 구현할 수 있을까 시간낭비하다가 주먹구구식으로 그냥 짰다ㅜㅜ
public class Main {
static int r;
static int c;
static int t;
static int a[][];
static Pair cle1 = null;
static Pair cle2 = null;
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
t = Integer.parseInt(st.nextToken());
a = new int[r][c];
for(int i=0; i<r; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<c; j++) {
a[i][j] = Integer.parseInt(st.nextToken());
if(a[i][j] == -1 && cle1 == null)
cle1 = new Pair(i, j, -1);
else if(a[i][j] == -1 && cle1 != null)
cle2 = new Pair(i, j, -1);
}
}
while(t-->0) {
bfs();
}
int sum = 0;
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
if(a[i][j] != -1)
sum += a[i][j];
System.out.println(sum);
}
public static void bfs() {
Queue<Pair> q = new LinkedList<Pair>();
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
if(a[i][j] != 0 && a[i][j] != -1)
q.offer(new Pair(i, j, a[i][j]));
int size = q.size();
while(size-->0) {
Pair p = q.poll();
int cnt = 0;
for(int i=0; i<4; i++) {
int nx = p.x + dx[i];
int ny = p.y + dy[i];
if(0 <= nx && nx < r && 0 <= ny && ny < c) {
if(a[nx][ny] != -1) {
q.offer(new Pair(nx, ny, p.dust/5));
cnt++;
}
}
}
q.offer(new Pair(p.x, p.y, p.dust - p.dust/5*cnt));
}
a = new int[r][c];
a[cle1.x][cle1.y] = -1;
a[cle2.x][cle2.y] = -1;
while(!q.isEmpty()) {
Pair p = q.poll();
a[p.x][p.y] += p.dust;
}
nonclockWise(cle1.x, cle1.y);
clockWise(cle2.x, cle2.y);
}
public static void nonclockWise(int x, int y) {
int temp = 0;
int last = 0;
while(true) {
if(y+1 >= c) break;
temp = a[x][y+1];
a[x][y+1] = last;
last = temp;
y++;
}
while(true) {
if(x-1 < 0) break;
temp = a[x-1][y];
a[x-1][y] = last;
last = temp;
x--;
}
while(true) {
if(y-1 < 0) break;
temp = a[x][y-1];
a[x][y-1] = last;
last = temp;
y--;
}
while(true) {
if(x+1 >= r) break;
temp = a[x+1][y];
if(temp == -1) break;
a[x+1][y] = last;
last = temp;
x++;
}
}
public static void clockWise(int x, int y) {
int temp = 0;
int last = 0;
while(true) {
if(y+1 >= c) break;
temp = a[x][y+1];
a[x][y+1] = last;
last = temp;
y++;
}
while(true) {
if(x+1 >= r) break;
temp = a[x+1][y];
a[x+1][y] = last;
last = temp;
x++;
}
while(true) {
if(y-1 < 0) break;
temp = a[x][y-1];
a[x][y-1] = last;
last = temp;
y--;
}
while(true) {
if(x-1 < 0) break;
temp = a[x-1][y];
if(temp == -1) break;
a[x-1][y] = last;
last = temp;
x--;
}
}
static class Pair {
int x;
int y;
int dust;
Pair(int x, int y, int dust) {
this.x = x;
this.y = y;
this.dust = dust;
}
}
}
반응형
'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글
[백준 17143] 낚시왕 (0) | 2019.06.24 |
---|---|
[백준 9506] 약수들의 합 (0) | 2019.06.20 |
[백준 16234] 인구 이동 (0) | 2019.06.20 |
[백준 14889] 스타트와 링크 (0) | 2019.06.20 |
[백준 문제집] N과 M 시리즈 (0) | 2019.06.19 |
Comments