https://www.acmicpc.net/problem/20057
20057번: 마법사 상어와 토네이도
마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을
www.acmicpc.net
풀이
문제를 보았을 때 알 수 있는 힌트
두가지 조건을 고려해서 문제를 풀면된다.
- 처음에 전체 모레의 양을 계산한다.
- 가운데 칸부터 토네이도 형식으로 이동한다.
- 이동할때 주변에 모래를 뿌려주면서 이동한다.
- 이후 안에 남은 모레를 계산해서 전체 모레를 빼고 남은 값이 답이 된다.
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
'Coding Test > baekjoon' 카테고리의 다른 글
[백준 1059] 좋은 구간- python (solved.ac - 실버 4) (0) | 2022.11.13 |
---|---|
[백준 15486] 퇴사 2- java (solved.ac - 골드 5) (1) | 2022.09.28 |
[백준 1715] 카드 정렬하기- java (solved.ac - 골드 4) (0) | 2022.09.20 |
[백준 2512] 예산- java (solved.ac - 실버 3) (0) | 2022.09.19 |
[백준 20055] 컨베이어 벨트 위의 로봇- java (solved.ac - 골드 5) (0) | 2022.09.18 |