https://www.acmicpc.net/problem/21610
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
음 요즘 계속 평일에 알고리즘을 못푸네요 ㅠㅠ
어쩌다보니 주말에 좀 풀게 되었는데 상황이 그렇게되어서 평일에 피곤하기도 하공 ㅠㅠ 나름 문제 읽고 풀려고하면 12시가 넘어서 ㅠ 일단 그래도 주말에라도 알고리즘 틈틈히 풀면서 포트폴리오도 쌓도록 하겠습니다.
이번 문제는 상당히 쉬웠습니다. 다만 조금 조건이 많은거 뺴곤 구현문제로써는 상당히 좋은문제라고 생각했습니다. ㅎㅎ
import java.util.*;
public class Main {
public static int maps[][];
public static boolean bCheck[][];
public static int n;
public static ArrayList<Cloud>clouds=new ArrayList<>();
public static class Cloud{
private int x;
private int y;
public Cloud(int x,int y) {
this.x=x;
this.y=y;
}
public void update(int x,int y) {
this.x=x;
this.y=y;
}
public int x() {
return this.x;
}
public int y() {
return this.y;
}
}
public static void Prints() {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
System.out.print(maps[i][j]+",");
}
System.out.println();
}
}
public static void moving(int movX,int movY, int S ) {
for(int i=0;i<S;i++) {
for(int j=0;j<clouds.size();j++) {
int tmpX=clouds.get(j).x();
int tmpY=clouds.get(j).y();
//이동
tmpX=tmpX+movX;
tmpY=tmpY+movY;
if(tmpX < 0 ) {
tmpX=n-1;
}
if(tmpX>n-1) {
tmpX=0;
}
if(tmpY < 0 ) {
tmpY=n-1;
}
if(tmpY>n-1) {
tmpY=0;
}
clouds.get(j).update(tmpX,tmpY);
}
}
//rain
for(int i=0;i<clouds.size();i++) {
int tmpX=clouds.get(i).x();
int tmpY=clouds.get(i).y();
maps[tmpX][tmpY]=maps[tmpX][tmpY]+1;
}
//대각선 4개 방향에 따라 물잇을시
int dirx[]= {-1,1,-1,1};
int diry[]= {-1,-1,1,1};
for(int i=0;i<clouds.size();i++) {
int tmpX=clouds.get(i).x();
int tmpY=clouds.get(i).y();
bCheck[tmpX][tmpY]=true;
//대각선 4개
int tmpcnt=0;
for(int j=0;j<4;j++) {
int tmpDirX=tmpX+dirx[j];
int tmpDirY=tmpY+diry[j];
if(tmpDirX == -1 ||tmpDirY == -1 || tmpDirX>n-1 ||tmpDirY>n-1) {
continue;
}
if(maps[tmpDirX][tmpDirY]<=0) {
continue;
}
tmpcnt++;
}
maps[tmpX][tmpY]=maps[tmpX][tmpY]+tmpcnt;
}
ArrayList<Cloud>tmpClouds=new ArrayList<>();
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(maps[i][j]>=2 && bCheck[i][j] == false) {
tmpClouds.add(new Cloud(i,j));
//bCheck[i][j]=true;
maps[i][j]=maps[i][j]-2;
}
}
}
//clouds.clear();
for(int i=0;i<clouds.size();i++) {
int tmpX=clouds.get(i).x();
int tmpY=clouds.get(i).y();
bCheck[tmpX][tmpY]=false;
}
clouds.clear();
for(int i=0;i<tmpClouds.size();i++) {
clouds.add(tmpClouds.get(i));
}
}
public static void main(String[] args) throws Exception {
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
int m=scan.nextInt();
//1부터 순서대로 ←, ↖, ↑, ↗, →, ↘, ↓, ↙
maps=new int[n][n];
bCheck=new boolean[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
int tmp = scan.nextInt();
maps[i][j]=tmp;
}
}
//비바라기를 시전하면 (N, 1), (N, 2), (N-1, 1), (N-1, 2)에 비구름
clouds.add(new Cloud(n-1,0));// (N, 1)
clouds.add(new Cloud(n-1,1));//(N, 2)
clouds.add(new Cloud(n-2,0));//(N-1, 1)
clouds.add(new Cloud(n-2,1));// (N-1, 2)
for(int z=0;z<m;z++) {
int d=scan.nextInt();
int s=scan.nextInt();
switch(d) {
case 1: // ←
moving( 0, -1, s );
break;
case 2: // ↖
moving( -1, -1, s );
break;
case 3: //↑
moving( -1, 0, s );
break;
case 4: //↗
moving( -1, 1, s );
break;
case 5: // →
moving( 0, 1, s );
break;
case 6: // ↘
moving( 1, 1, s );
break;
case 7: //↓
moving( 1, 0, s );
break;
case 8: //↙
moving( 1, -1, s );
break;
default:
break;
}
}
int sum=0;
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
sum=sum+maps[i][j];
}
}
System.out.println(sum);
}
}
'알고리즘 공부' 카테고리의 다른 글
백준-배열돌리기3 (1) | 2024.03.25 |
---|---|
백준 - 마법사 상어와 파이어볼 (0) | 2024.03.03 |
백준 컨베이어 밸트 위의 로봇 (1) | 2024.02.17 |
백준 빗물 (0) | 2024.02.11 |
백준 미로 만들기 (1) | 2024.02.02 |