Coding Test/baekjoon

[백준 20057] 마법사 상어와 토네이도- java (solved.ac - 골드 3)

조용장 2022. 9. 26. 14:54

https://www.acmicpc.net/problem/20057

 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

풀이

문제를 보았을 때 알 수 있는 힌트

두가지 조건을 고려해서 문제를 풀면된다.

  1. 처음에 전체 모레의 양을 계산한다.
  2. 가운데 칸부터 토네이도 형식으로 이동한다.
  3. 이동할때 주변에 모래를 뿌려주면서 이동한다.
  4. 이후 안에 남은 모레를 계산해서 전체 모레를 빼고 남은 값이 답이 된다.

2번과 3번 각자 구현하고 합치면 된다.

2번 조건 : 토네이도 형식은 좌하우상 순으로 움직이며 2번에 한번씩 카운트 수를 증가 시킨다.

증가시킨 카운트 만큼 앞으로 전진한다고 생각하고 구현하면 토네이도는 쉽게 구현할 수 있다.

3번 조건 : 주변 모래를 뿌리기 위해서는 상하좌우를 생각하여 %를 계산하여 뿌려준다.

뿌려주는 방식은 현재 위치에서 방향 값을 가져와서 앞,뒤 옆을 다 계산하였다.

앞으로 가는 방향이라는 그곳에 1,3 을 더하면 양 옆을 보는 값이 된다. 이를 이용해서 계산하였다.

이를 반복적으로하면 밖으로 나가는 모레가 발생한다.

package baekjoon20057;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	static int n,a[][];
	static int point_x,point_y;
	static int dx[] = {-1,0,1,0};
	static int dy[] = {0,1,0,-1};
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer token;
		n = Integer.parseInt(br.readLine());
		a=new int[n+4][n+4];
		point_x = (n+4)/2;
		point_y = (n+4)/2;
		int total=0;
		for (int i = 2; i < n+2; i++) {
			token = new StringTokenizer(br.readLine());
			for (int j = 2; j < n+2; j++) {
				a[i][j] = Integer.parseInt(token.nextToken());
				total+=a[i][j];
			}
		}
		
		int count=1;
		int rotate=0;
		while(true) {
			for (int i = 0; i < count; i++) {
				point_y = point_y+dy[rotate%4];
				point_x = point_x+dx[rotate%4];
				move(point_y,point_x,rotate%4);
				if(point_y==2 && point_x==2) {
					break;
				}
				
			}
			if(point_y==2 && point_x==2) {
				break;
			}
			rotate+=1;
			for (int i = 0; i < count; i++) {
				point_y = point_y+dy[rotate%4];
				point_x = point_x+dx[rotate%4];
				move(point_y,point_x,rotate%4);

			}

			rotate+=1;
			count+=1;
		}
		int result = 0;
		for (int i = 2; i < n+2; i++) {
			for (int j = 2; j < n+2; j++) {
				result+=a[i][j];
			}
		}
		System.out.println(total-result);
		
	}
	static void move(int point_y,int point_x,int rotate) {
		int temp = a[point_y][point_x];
		a[point_y][point_x]=0;
		int total=0;
		a[point_y-dy[rotate]+dy[(rotate+1)%4]][point_x-dx[rotate]+dx[(rotate+1)%4]] += (temp*1/100);
		a[point_y-dy[rotate]+dy[(rotate+3)%4]][point_x-dx[rotate]+dx[(rotate+3)%4]] +=(temp*1/100);
		a[point_y+dy[(rotate+1)%4]][point_x+dx[(rotate+1)%4]] += (temp*7/100);
		a[point_y+dy[(rotate+3)%4]][point_x+dx[(rotate+3)%4]] += (temp*7/100);
		a[point_y+(dy[(rotate+1)%4]*2)][point_x+(dx[(rotate+1)%4]*2)] += (temp*2/100);
		a[point_y+(dy[(rotate+3)%4]*2)][point_x+(dx[(rotate+3)%4]*2)] += (temp*2/100);
		a[point_y+dy[rotate]+dy[(rotate+1)%4]][point_x+dx[rotate]+dx[(rotate+1)%4]] += (temp*10/100);
		a[point_y+dy[rotate]+dy[(rotate+3)%4]][point_x+dx[rotate]+dx[(rotate+3)%4]] += (temp*10/100);
		a[point_y+dy[rotate]*2][point_x+dx[rotate]*2] += (temp*5/100);
		total+=(temp*1/100)*2+(temp*7/100)*2+(temp*2/100)*2+(temp*10/100)*2+(temp*5/100);
		a[point_y+dy[rotate]][point_x+dx[rotate]] += temp-total;
		
		
	}

}

https://github.com/dydwkd486/coding_test/blob/main/baekjoon/java/baekjoon20057/Main.java

 

GitHub - dydwkd486/coding_test: 코딩테스트 공부한 내용 정리

코딩테스트 공부한 내용 정리. Contribute to dydwkd486/coding_test development by creating an account on GitHub.

github.com