Asteroid Collision

MediumArrayStackSimulation

Solution

export function asteroidCollision(asteroids: number[]): number[] {
  const remainAsteroids: number[] = [];
 
  for (const asteroid of asteroids) {
    let isExploded = false;
    while (
      0 < remainAsteroids.length &&
      0 < remainAsteroids[remainAsteroids.length - 1] &&
      asteroid < 0 &&
      !isExploded
    ) {
      const lastRemainAsteroid = remainAsteroids[remainAsteroids.length - 1];
      // 만약 남아있는 마지막 소행성이 더 작거나 같으면, 마지막 소행성은 폭발
      if (Math.abs(lastRemainAsteroid) <= Math.abs(asteroid)) {
        remainAsteroids.pop();
      }
      // 마지막 소행성보다 같으면, 두 소행성 모두 폭발하게되고,
      // 마지막 소행성이 더 크다면, 해당 소행성은 남아있게 된다.
      isExploded = Math.abs(lastRemainAsteroid) >= Math.abs(asteroid);
    }
 
    if (!isExploded) {
      remainAsteroids.push(asteroid);
    }
  }
 
  return remainAsteroids;
}