<Algorithm> 78. 15685번 드래곤커브
by BFine반응형
1. 15685번 드래곤커브
상반기 삼성전자 오후에 봤었던 문제이다. 당시에 손도 못댔고 지금도 접근법이 감이 안잡혀서 힌트를 보고 풀었다.
드래곤커브에 규칙이 있는데 방향을 누적하여 이전 세대까지 누적된 거에 역순으로 +1 씩 해주면 그 다음세대의 방향을 알 수 있었다.
처음에 점에 대한 규칙으로만 하려고 하니 점에 대한 규칙이 너무 복잡하고 계속 늘어나기 때문에 할 수가 없었다.
시뮬레이션으로 분류된 문제인데 이런 류의 문제는 여러 부분에 대한 규칙을 따져보아야 하는 것 같다.
특히 이렇게 누적되는 문제는 하나를 기준으로 하는 게 좋을 것 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; import java.util.StringTokenizer; public class Main { static boolean[][] visited; static Stack<Integer> stack; public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; int N = Integer.parseInt(br.readLine()); int[][] arr = new int[N][4]; visited = new boolean[300][300]; for(int i = 0; i < N; i ++) { st = new StringTokenizer(br.readLine()); for(int j = 0; j < 4; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } for(int i = 0; i < N; i++) { stack = new Stack<>(); stack.add(arr[i][2]); init(arr, stack, arr[i][3], 0); visit(arr[i][0], arr[i][1]); } int res = 0; for(int i = 0; i < 300; i++) { for(int j = 0; j < 300; j++) { if(visited[i][j]) { if(visited[i+1][j]&&visited[i][j+1]&&visited[i+1][j+1]) { res++; } } } } System.out.println(res); } public static void init(int[][] arr, Stack<Integer> stack, int g, int count) { if(count == g) return; // 역순으로 이전에 누적된 값들을 +1씩해준다. for(int i = stack.size() -1; i >= 0; i--) { if(stack.get(i) != 3) { stack.add(stack.get(i)+1); }else { stack.add(0); } } init(arr, stack, g, count+1); } private static void visit(int x, int y) { x +=100; y +=100; visited[x][y] = true; for(int i = 0; i < stack.size(); i++){ int order = stack.get(i); // 드래곤커브 제작 switch (order) { case 0 : x++; break; case 1 : y--; break; case 2 : x--; break; default: y++; break; } visited[x][y] = true; } } } | cs |
참고 & 출처 http://limkydev.tistory.com/158
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 80. 3986번 좋은 단어 (0) | 2018.09.09 |
---|---|
<Algorithm> 79. 10988번 팰린드롬인지 확인하기 (0) | 2018.09.09 |
<Algorithm> 77. 1149번 RGB거리 (0) | 2018.09.07 |
<Algorithm> 76. 5719번 거의 최단경로 (0) | 2018.09.05 |
<Algorithm> 75. 1507번 궁금한 민호(floyd) (0) | 2018.09.03 |
블로그의 정보
57개월 BackEnd
BFine