본문 바로가기
알고리즘/백준

[Java] BOJ 15685번 드래곤커브

by 컴공맨 2021. 8. 6.
 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net


풀이

코드의 주석을 참고해주세요


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	public static int N, answer;
	public static List<Integer> dirList;
	public static boolean[][] map = new boolean[101][101];
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		
		N = Integer.parseInt(br.readLine());
		
		for (int i = 1; i <= N; ++i) {
			st = new StringTokenizer(br.readLine(), " ");
			
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			int g = Integer.parseInt(st.nextToken());

			getDir(d, g);
			makeDragonCurve(y, x);
		}
		
		answer = countSqure();
		
		System.out.println(answer);
	}
	
	// 0 : 우, 1 : 상, 2 :좌, 3: 하
	// 90도 돌렸을때의 순서
	// +2씩 하면 뒤집을 수도 있다.
	public static int[] dy = {0, -1, 0, 1};
	public static int[] dx = {1, 0, -1, 0};
	public static void getDir(int d, int g) {
		// 드래곤커브의 랭크별 방향이 들어간다.
		dirList = new ArrayList<Integer>();
		// 드래곤커브의 방향을 구할때 이전 방향의 역순부터 구해야하므로 스택을 사용
		Stack<Integer> stk = new Stack<Integer>();
		
		// 시작지점의 드래곤커브의 방향을 넣는다
		dirList.add(d);
		
		// 첫 시작 후 세대를 1 올려준다.
		int rank = 1;
		
		// 구하고자하는 세대까지 드래곤커브의 방향을 구한다
		while (rank <= g) {
			// 지금까지 구한 드래곤커브의 방향을 스택에 담아 역순으로 사용하기 위함
			for (int dir : dirList) {
				stk.push(dir);
			}
			
			// 다음 세대의 방향을 구한다.
			while (!stk.isEmpty()) {
				int dir = stk.pop();
				
				// 90도 회전시킨 후
				dir = ((dir - 1) < 0) ? 3 : (dir - 1);
				// 드래곤 커브를 그리기 위해 방향을 뒤집어 준다.
				dir = (dir + 2) % 4;
				
				// 구한 방향을 리스트에 추가
				dirList.add(dir);
			}
			
			// 세대를 1 올려준다.
			rank++;
		}
	}
	
	// 드래곤 커브를 배열에 그려준다.
	public static void makeDragonCurve(int y, int x) {
		map[y][x] = true;
		
		for (int dir : dirList) {
			y += dy[dir];
			x += dx[dir];
			
			map[y][x] = true;
		}
	}
	
	// 배열에서 문제에서 주어진 1x1 크기의 정사각형 개수를 구해준다.
	public static int countSqure() {
		int cnt = 0;
		
		// +1 을 해서 수를 구하므로 101 - 1 즉, 100번 인덱스 까지만 계산하면 된다.
		for (int i = 0; i < 100; ++i) {
			for (int j = 0; j < 100; ++j) {
				if (map[i][j] && map[i][j + 1] && map[i + 1][j] && map[i + 1][j + 1]) {
					cnt++;
				}
			}
		}
		
		return cnt;
	}
}

 

 

GitHub - pyo7410/Algorithm: 1일 1커밋을 목표로!

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 1339번 단어 수학  (0) 2021.08.11
[Java] BOJ 1967번 트리의 지름  (0) 2021.08.09
[Java] BOJ 1504번 특정한 최단 경로  (0) 2021.08.04
[Java] BOJ 1806번 부분합  (0) 2021.08.03
[Java] BOJ 2573번 빙산  (0) 2021.08.02