Leetcode Java Asteroid Collision

업데이트:

문제

Link

코드

class Solution {

  public int[] asteroidCollision(int[] asteroids) {
    int index = -1;
    for (int asteroid : asteroids) {
      boolean alive = true;
      while (alive && asteroid < 0 && index >= 0 && asteroids[index] > 0) {
        alive = asteroids[index] + asteroid < 0;
        if (asteroids[index] + asteroid <= 0) {
          index--;
        }
      }
      if (alive) {
        asteroids[++index] = asteroid;
      }
    }
    return Arrays.copyOf(asteroids, index + 1);
  }

}

결과

Link

설명

  1. 연속적으로 소행성의 크기를 저장한 asteroids 배열을 이용하여 살아남은 소행성을 반환하는 문제이다.
    • 양수는 오른쪽 음수는 왼쪽으로 이동하는 방향을 나타낸다.
    • 양수와 음수로 마주치는 두 소행성의 경우, 크기가 큰 소행성만 살아남는다.
    • 양수와 음수로 마주치는 두 소행성의 크기가 같은 경우, 두 소행성 모두 폭발한다.
    • 소행성은 모두 같은 속도로 움직이며, 같은 방향으로 움직이는 소행성은 절대 만나지 않는다.
  2. index는 살아남은 소행성만 저장한 asteroids 배열을 자르기 위한 위치 변수로, -1로 초기화한다.

  3. asteroids 배열을 순서대로 asteroid 변수에 넣어 아래를 반복한다.
    • alive는 살아있는 상태를 저장하기 위한 변수로, true로 초기화한다.
    • alive가 true로 살아있는 소행성이면서 asteroid인 소행성의 크기가 음수이고 index가 0보다 크면서 asteroids의 index번째 소행성의 크기가 0보다 커서 마주치면 아래를 계속 수행한다.
      • alive에 asteroids의 index번째 소행성의 크기와 asteroid의 합이 0보다 작은지를 여부를 넣어준다.
      • asteroids의 index번째 소행성의 크기와 asteroid의 합이 0보다 같거나 작으면 해당 행성을 제거해야하므로, index를 감소시킨다.
    • alive가 true인 살아남는 소행성인 경우, index를 증가시키고 asteroid의 index번째 위치에 해당 소행성의 크기인 asteroid를 넣어준다.
  4. 반복이 완료되면 살아남은 소행성을 순차적으로 index번째까지 저장한 asteroids를 $index + 1$ 크기의 새 배열로 복사하여 주어진 문제의 결과로 반환한다.

소스

Sample Code는 여기에서 확인 가능합니다.

댓글남기기