diff --git "a/LiiNi-coder/202601/27 BOJ \353\257\270\354\271\234 \354\225\204\353\221\220\354\235\264\353\205\270.md" "b/LiiNi-coder/202601/27 BOJ \353\257\270\354\271\234 \354\225\204\353\221\220\354\235\264\353\205\270.md" new file mode 100644 index 00000000..aa40d39d --- /dev/null +++ "b/LiiNi-coder/202601/27 BOJ \353\257\270\354\271\234 \354\225\204\353\221\220\354\235\264\353\205\270.md" @@ -0,0 +1,159 @@ +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.awt.Point; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +public class Main{ + private static int R, C; + //private static int[][] Map; + private static Set Enemies; + private static Set tempEnemies; + private static Set MustDestroy = new HashSet<>(); + private static Point Arduino; + private static char[] IdsOfMoving = new char[100]; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] tokens = br.readLine().split(" "); + R = Integer.parseInt(tokens[0] ); + C = Integer.parseInt(tokens[1]); + Enemies = new HashSet<>(); + tempEnemies = new HashSet<>(); + for(int r = 0; r(); + char idOfMoving = IdsOfMoving[t]; + // 1. 입력에 따라 아두이노 이동 + // 입력에 따라 이동: O(1) + int[] temp = getDrDc(idOfMoving); + int dr = temp[0]; int dc = temp[1]; + Arduino.translate(dr, dc); + + // 2. 아두이노가 적칸에 있는지 확인 : O(1) <- 상태표시 Set에 판별 + if(Enemies.contains(Arduino)){ + // 맞다면 게임오버 + isGameOver = true; + break; + } + // 3. 모든 적들을 순회하여 : 적들의 좌표를 바로 알수있도록 해야함 -> Set + // 아두이노와 가까워지는 방향을 구한후 이동O(1): Set에서 삭제 후 이동후 삽입 -> 파괴해야할 것 Q에 넣음, 해당 칸에 아두이노 있는지확인 + Iterator iter = Enemies.iterator(); + while(iter.hasNext()){ + Point enemy = iter.next(); + temp = getDrDcForwardTo(enemy, Arduino); + dr = temp[0]; dc = temp[1]; + Point np = new Point(enemy.x + dr, enemy.y + dc); + boolean isNotOverlap = tempEnemies.add(np); + if(!isNotOverlap){ + MustDestroy.add(np); + } + } + Enemies = tempEnemies; + // 4. 적들의 하나라도 아두이노 칸에 있다면 게임오버 : + if(Enemies.contains(Arduino)){ + isGameOver = true; + break; + } + // 5. 적이 겹쳐져 있는지를 파악 후 겹쳐져있다면 해당 적 모두 파괴 : 파괴Q를 poll하면서 파괴해나감 + iter = MustDestroy.iterator(); + while(iter.hasNext()){ + Point destroy = iter.next(); + Enemies.remove(destroy); + } + MustDestroy.clear(); + + } + + if(isGameOver){ + System.out.print("kraj "); + System.out.println(t+1); + }else{ + print(); + } + br.close(); + } + + private static void print() { + String[] display = new String[R]; + for(int r = 0; r target.x){ + dr = -1; + }else{ + dr = 0; + } + if(me.y < target.y){ + dc = 1; + }else if(me.y > target.y){ + dc = -1; + }else{ + dc = 0; + } + return new int[]{dr,dc}; + } + + private static int[] getDrDc(char idOfMoving) { + int[][] drdcs = new int[][]{ + {}, //0 + {1, -1}, + {1, 0}, + {1, 1}, + {0, -1}, + {0, 0}, + {0, 1}, + {-1, -1}, + {-1, 0}, + {-1, 1} + }; + return drdcs[idOfMoving - '0']; + } +} +```