반응형
걸린시간 : 1h 50m
1. 문제
https://www.acmicpc.net/problem/21610
2. 접근법
빡구현이라고도 애매한 구현 ..
배열 옮기기가 좀 빡셌다 ( 구름 이동시 )
조건에서 유의하라고 나온 부분을 잘 보면서 풀도록 하자 ..
나는 visit[][] 를 만들어서
0 = 구름 없음
1 = 아까전 구름
2 = 지금 구름임
으로 나누어서 풀었다
3. 코드
package boj;
import java.util.*;
import java.io.*;
public class bj21610마법사상어와비바라기 {
static int n,m;
static int di,si;
static int map[][];
static int visit[][];
static int ans;
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][n];
visit = new int[n][n];
for(int i=0;i<n;i++) {
st = new StringTokenizer(br.readLine());
for(int j=0;j<n;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
//처음 구름 생성
int dx[] = {0,0,-1,-1};
int dy[] = {0,1,0,1};
for(int i=0;i<4;i++) {
int nx = (n-1)+dx[i];
int ny = dy[i];
visit[nx][ny] = 2;
}
//printMap();
for(int i=0;i<m;i++) {
st = new StringTokenizer(br.readLine());
di = Integer.parseInt(st.nextToken())-1;
si = Integer.parseInt(st.nextToken());
move();
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
ans = ans+map[i][j];
}
}
System.out.println(ans);
}
private static void move() {
//구름 이동
int dx[] = {0,n-1,n-1,n-1,0,1,1,1};
int dy[] = {n-1,n-1,0,1,1,1,0,n-1};
int nx =0;
int ny=0;
//printMap1();
Queue<int[]> q = new LinkedList<>();
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(visit[i][j]==2) {
q.offer(new int[] {i,j});
visit[i][j]=0;
}
}}
while(!q.isEmpty()) {
int arr[] = q.poll();
int arrx = arr[0];
int arry = arr[1];
nx = (arrx+dx[di]*si) % n;
ny = (arry+dy[di]*si) % n;
visit[nx][ny] = 2;
}
addWater();
}
private static void addWater() {
int dx[] = {-1,-1,1,1};
int dy[] = {-1,1,1,-1};
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(visit[i][j]==2) {
map[i][j]++;
visit[i][j]=1; // 구름 삭제
}
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(visit[i][j]==1) {
for(int k=0; k<4;k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if(!check(nx,ny)) continue;
if(map[nx][ny]!=0) map[i][j]++;
}
}
}
}
nextCloud();
}
private static void nextCloud() {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(visit[i][j]==1) {
continue; // 아까 구름 생긴곳
}
if(map[i][j] >=2) {
visit[i][j] =2;
map[i][j]= map[i][j]-2;
}
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(visit[i][j]==1) {
visit[i][j]=0;
}
}
}
}
private static boolean check(int x, int y) {
if(x<0||x>=n||y<0||y>=n) return false;
return true;
}
}반응형
'알고리즘 > 백준' 카테고리의 다른 글
| [삼성기출 코드트리][Java] 왕실의 기사대결 - 골드3, BFS, 시뮬레이션 (3) | 2024.10.12 |
|---|---|
| [삼성기출 코드트리][Java] 예술성 - 골드3, bfs, 구현 (3) | 2024.10.11 |
| [삼성기출 코드트리][Java] 마법의숲 탐색 - 골드3 (2) | 2024.10.09 |
| [백준 1926] 그림 - BFS, 실버1 (0) | 2024.10.08 |
| [백준 15683] Java - 감시, 골드3, 시뮬레이션 (0) | 2024.10.06 |