1. 문제
https://www.acmicpc.net/problem/15685
2. 풀이과정
문제에서 주어지는 x, y를 반대로 생각하는 게 편해서 x를 세로축, y를 가로축으로 생각하고 풀었습니다.
90도 회전하는 방법
1) x증가량 => y감소량 & x감소량 => y증가량
2) y증가량 => x증가량 & y감소량 => x감소량
따라서 nx = 끝점 - (y변화량), ny = 끝점 +(x변화량)이 된다.
다 구하면, 끝점을 업데이트 해주어야 한다.
끝점은 무조건 size번째에 오기 때문에 끝점을 dragon.get(size)에 있는 값으로 업데이트 해주고 90도 회전을 세대수만큼 반복한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static boolean map[][];
static int dx[] = {0, -1, 0, 1}, dy[] = {1, 0, -1, 0};
public static void simulation(int x, int y, int dir, int cnt){
ArrayList<int[]> dragon = new ArrayList<>();
int nx = x + dx[dir];
int ny = y + dy[dir];
map[x][y] = map[nx][ny] = true;
dragon.add(new int[]{x, y});
dragon.add(new int[]{nx, ny});
x = nx;
y = ny;
for(int i=0; i<cnt; i++){
int size = dragon.size();
for(int j=0; j<size; j++){
int[] now = dragon.get(j);
nx = x + now[1] - y;
ny = y - (now[0] - x);
map[nx][ny] = true;
dragon.add(new int[]{nx, ny});
}
x = dragon.get(size)[0];
y = dragon.get(size)[1];
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
map = new boolean[101][101];
int n = Integer.parseInt(br.readLine());
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
int cnt = Integer.parseInt(st.nextToken());
simulation(x, y, dir, cnt);
}
//네점이 모두 true면 cnt++
int result = 0;
for(int i=0; i<100; i++){
for(int j=0; j<100; j++){
if(map[i][j] && map[i+1][j] && map[i+1][j+1] && map[i][j+1]){
result++;
}
}
}
System.out.println(result);
}
}
결과
'코딩문제풀이 > Baekjoon' 카테고리의 다른 글
[Java] 백준 16234번 : 인구 이동 (0) | 2022.12.15 |
---|---|
[Java] 백준 12869번 : 뮤탈리스크* (1) | 2022.12.14 |
[Java] 백준 2023번 : 신기한 소수 (0) | 2022.12.12 |
[Java] 백준 14719번 : 빗물 (0) | 2022.12.11 |
[Java] 백준 3190번 : 뱀 (1) | 2022.12.10 |