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

+ Recent posts