Algorithm

[Algorithm] 뱀

씬프 2021. 5. 31. 17:14
반응형
import java.util.*;

class TimeInfo {
  private int time;
  private char direction;

  public TimeInfo (int time, char direction) {
    this.time = time;
    this.direction = direction;
  }

  public int getTime() {
    return this.time;
  }

  public char getDirection() {
    return this.direction;
  }
}

class Snake {
  private int x;
  private int y;

  public Snake(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int getX() {
    return this.x;
  }

  public int getY() {
    return this.y;
  }
}

class Main {

  public static int n, k, l;
  public static int[][] map = new int[101][101];
  // 시간에 따른 턴 정보
  public static List<TimeInfo> list = new ArrayList<>();
  // 뱀이 위치하는 칸 정보
  public static Queue<Snake> s = new LinkedList<>();

  // 방향 정보 동 남 서 북
  public static int[] dx = {0, 1, 0, -1};
  public static int[] dy = {1, 0, -1, 0};

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    k = sc.nextInt();
    for (int i = 0; i < k; i++) {
      int x = sc.nextInt();
      int y = sc.nextInt();
      // 사과 위치 정보 입력
      map[x][y] = 1;
    }

    l = sc.nextInt();
    for (int i = 0; i < l; i++) {
      int t = sc.nextInt();
      char d = sc.next().charAt(0);
      list.add(new TimeInfo(t, d));
    }

    // 뱀은 맵 안에서만 움직인다. 자신을 만나면 멈춘다.
    int direction = 0; // 방향값
    int result = 0; // 시간
    int index = 0; // list 읽어오는 시간정보에대해서
    int x = 1, y = 1;
    map[x][y] = 2; // 뱀 있는 자리 2
    s.offer(new Snake(x,y));
    while (true) {
      TimeInfo info = list.get(index);

      int nx = x + dx[direction];
      int ny = y + dy[direction];
      result++;
      if (1 <= nx && nx <= n && 1 <= ny && ny <= n
        && map[nx][ny] != 2){
          // 가려는 자리가 범위 안에 있고 뱀 꼬리도 아닐 때
          // 그곳에 사과가 있다면?
          if (map[nx][ny] != 1) {
            // 꼬리가 0이 되어야 하는데...?
            Snake tail = s.poll();
            map[tail.getX()][tail.getY()] = 0;
          }
          map[nx][ny] = 2;
          x = nx;
          y = ny;
          s.offer(new Snake(x,y));
      } else {
        // 가려는 곳이 못가는 곳 일 때,
        break;
      }
      
      // 턴 해야할 때...
      if (result == info.getTime()) {
        if (info.getDirection() == 'L') {
          // 왼쪽
          direction = (direction == 0) ? 3 : direction - 1;
        } else {
          direction = (direction == 3) ? 0 : direction + 1;
        }
        // index가 l (주어진 타임정보 넘어서면 안됨)
        index++;
        if (index == l) {
          index = 0;
        }
      }
    }

    System.out.println(result);

    
  } // end main
}

구현문제 같다.

뱀의 정보는 꼬리부터 머리까지 큐로 구현했다. (사과를 못 먹으면 꼬리가 사라져야함.)

천천히 하나하나 필요한 것을 구현하면서 진행했다.

처음에 굉장히 길을 못잡았는데, 기능을 정리하면서 구현하니까 풀어졌다.

그리고 중간에 오타는 항상 문제다.

 

'Algorithm' 카테고리의 다른 글

[Algorithm] 볼링공 고르기  (0) 2021.06.02
[Algorithm] 문자열 뒤집기  (0) 2021.06.01
[Algorithm] 곱하기 혹은 더하기  (0) 2021.05.31
[Algorithm] 모험가 길드  (0) 2021.05.30
[Algorithm] 커리큘럼  (0) 2021.05.29