알고리즘 풀이/백준

[백준][Java] 15685번 드래곤 커브 (구현)

배게 2022. 3. 18. 03:55
728x90

규칙 찾으면 끝

N세대의 드래곤 커브는 N-1세대커브의 역순의 막대기들을 뽑아서 그리는데

화살표 방향이 index를 +1한 방향으로 수정한 후에 그리면 된다

 

드래곤 커브를 세대별로 전부 모아서 그려도 되고

나같은 경우는 그냥 1세대씩 그리고 모으고 그리고 모으고 했음

 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

 
 
public class Main {
        
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    public static void main(String[] args) throws IOException{
    			  //→, ↑,  ←, ↓
    	int[] dr = {0, -1, 0, 1};
    	int[] dc = {1, 0, -1, 0};
    	
    	int[][] matrix = new int[101][101];
    	
    	int N = stoi(br.readLine());
    	for(int i=0; i<N; i++) {
    		String[] str = br.readLine().split(" ");
    		int c = stoi(str[0]);
    		int r = stoi(str[1]);
    		int dir = stoi(str[2]);
    		int gen = stoi(str[3]);
    		List<Integer> dirList = new ArrayList<>();
    		dirList.add(dir);
    		matrix[r][c] = 1;
    		r+=dr[dir];
    		c+=dc[dir];
    		matrix[r][c] = 1;
    		
    		for(int j=1; j<=gen; j++) {
    			Queue<Integer> q = new LinkedList<>();
    			for(int k=dirList.size()-1; k>=0; k--) {
    				int currDir = (dirList.get(k)+1)%4;
    				r+=dr[currDir];
    				c+=dc[currDir];
    				matrix[r][c] = 1;
    				
    				q.add(currDir);
    			}		
    			while(!q.isEmpty()) {
    				dirList.add(q.poll());
    			}
    		}
    	}
    	
//    	for(int i=0; i<10; i++) {
//    		for(int j=0; j<10; j++) {
//    			System.out.print(matrix[i][j]+" ");
//    		}
//    		System.out.println();
//    	}
    	int answer = 0;
    	for(int i=0; i<100; i++) {
    		for(int j=0; j<100; j++) {
    			if(matrix[i][j]==1 && matrix[i][j+1]==1 &&
    				matrix[i+1][j]==1 && matrix[i+1][j+1]==1) {
    				answer++;
    			}
    		}
    	}
    	System.out.println(answer);
    	
    }

	private static int stoi(String input) {
        return Integer.parseInt(input);
    }
}