π λ¬Έμ
- νμ±μ ν¬κΈ°μ λ°©ν₯μ λνλ΄λ μ μ λ°°μ΄(`asteroids`)μ΄ μ£Όμ΄μ§
- μμλ μΌμͺ½, μμλ μ€λ₯Έμͺ½μΌλ‘ μ΄λ
- νμ±μ μΈλ±μ€λ μλμ μΈ μμΉλ₯Ό λνλΈλ€.
- κ°μ λ°©ν₯μΌλ‘ μ΄λνλ νμ±μ μ λ μΆ©λνμ§ μλλ€.
- `νμ±μ΄ μΆ©λνλ κ²½μ°` λ μμ νμ±λ§ νκ΄΄ λκ³ , ν¬κΈ°κ° κ°μΌλ©΄ λ λ€ νκ΄΄ λλ€.
μꡬμ¬ν: μ΄μλ¨μ μνμ±λ€μ μΆλ ₯νκΈ°
μκ°νκΈ°
μ΄λ€ κ²½μ°μ μνμ±λ€μ΄ μΆ©λνλμ§ μμ 보μ
μ κ·Έλ¦Όμμ 보면 `μμ, μμ` μμλλ‘ μ£Όμ΄μ‘μ λλ§ μνμ±μ΄ μΆ©λνλ€.
μΆ©λνλ κ²½μ°λ₯Ό μμμΌλ, μμ λ₯Ό ν΅ν΄μ μ κ·Ό λ°©μμ μμ보μ.
asteroids = `[-1, -2, 12, 11, 6, 5, -10, 4, -4, 6, 7]` μΌ λ,
[5,-10] ꡬκ°μμ μλμ κ°μ΄ μΆ©λμ΄ μ°μμ μΌλ‘ λ°μνλ€.
- |5| < |-10| μΌλ‘ 5 ν¬κΈ°μ μνμ±μ νκ΄΄λλ€.
- [6] < |-10| μ΄λ―λ‘ 6 ν¬κΈ°μ μνμ±μ νκ΄΄λλ€.
- |11| > |-10| μ΄λ―λ‘ 10 ν¬κΈ°μ μνμ±μ νκ΄΄λλ€.
μ μΆ©λ ν λ¨μ μλ μνμ±λ€μ `[ -1, -2, 12, 11, 4, -4, 6, 7 ]` μ΄ λλ€.
[4,-4] ꡬκ°μμ λ€μ μΆ©λμ΄ λ°μνκ³ , λ μνμ±μ ν¬κΈ°κ° λμΌνλ―λ‘ λ λ€ νκ΄΄λλ€.
κ²°κ΅ μ΄μ λ¨μ μνμ±λ€μ `[-1, -2. 12, 11, 6, 7]` μ΄ λλ€.
μ μμ μμ μ μ μλ κ·μΉ
1. λ°°μ΄ λ΄μμ μ²μ μμκ° λμ¬ λκΉμ§μ μμλ€μ λͺ¨λ μ΄μλ¨μ
2. μμλ€μ μΈλ±μ€κ° μ§λ¬μ΄λ μ°μ μΆ©λλ‘ μΈν΄ νκ΄΄λ μ μμ
π μμλ€μ μ μ₯ν΄λ 곡κ°μ΄ νμνλ€.
λλ `Deque`λ₯Ό μ΄μ©ν΄μ μμλ₯Ό μ μ₯νλ€.
π³ μ 체 μμ€ μ½λ
class Solution {
static List<Integer> list;
public static int addMinus(int idx, int[] asteroids){
while (idx<asteroids.length && asteroids[idx]<0){
list.add(asteroids[idx++]);
}
return idx;
}
public int[] asteroidCollision(int[] asteroids) {
Deque<Integer> queue = new ArrayDeque<>();
list = new ArrayList<>();
int idx = 0;
// μ²μ μμ μ°ΎκΈ°
idx =addMinus(idx,asteroids);
while (idx < asteroids.length) {
// λ€μ μμ κΉμ§ stackμ μμ list μ μ₯
while (idx<asteroids.length && asteroids[idx] > 0) {
queue.addFirst(asteroids[idx++]);
}
if(idx>=asteroids.length) break;
int cur = asteroids[idx] *-1;
// μ μ μ΄λ―λ‘ stack vs μμ
while (!queue.isEmpty()) {
int plus = queue.pop();
if(plus==cur){
idx++;
break;
}
else if(plus>cur){
idx++;
queue.addFirst(plus);
break;
}
}
if(queue.isEmpty()){
idx=addMinus(idx,asteroids);
}
}
while (!queue.isEmpty()) {
list.add(queue.pollLast());
}
return list != null ? list.stream().mapToInt(Integer::intValue).toArray() : new int[0];
}
}
β λΆλΆ μ½λ μ€λͺ
λ³μ μ μΈ & μ²μμΌλ‘ λμ€λ μμ μ°ΎκΈ°
public class N_735 {
static List<Integer> list;
public static int addMinus(int idx, int[] asteroids){
while (idx<asteroids.length && asteroids[idx]<0){
list.add(asteroids[idx++]);
}
return idx;
}
public static int[] asteroidCollision(int[] asteroids) {
Deque<Integer> queue = new ArrayDeque<>();
list = new ArrayList<>();
int idx = 0;
// μ²μ μμ μ°ΎκΈ°
idx =addMinus(idx,asteroids);
...
}
}
- `list`: μ΄μ λ¨μ μνμ± μ μ₯
- `queue`: μμ μ μ₯
- `addMinus()`: λ€μ μμκ° λμ€κΈ° μ΄μ μ μμ μ μ₯, μμ μμΉ(`idx`) λ°ν
μΆ©λ λ€λ£¨κΈ°
public static int[] asteroidCollision(int[] asteroids) {
...
while (idx < asteroids.length) {
// λ€μ μμκΉμ§ queueμ μμ μ μ₯
while (idx<asteroids.length && asteroids[idx] > 0) {
queue.addFirst(asteroids[idx++]);
}
// λ°°μ΄μ λμ λλ¬ν κ²½μ° νμΆ
if(idx>=asteroids.length) break;
int cur = asteroids[idx] *-1; // μμ μ λκ° μ μ₯
while (!queue.isEmpty()) {
int plus = queue.pop();
// ν¬κΈ°κ° λμΌν κ²½μ° λ λ€ νκ΄΄
if(plus==cur){
idx++;
break;
}
// plusμ ν¬κΈ°κ° λ ν° κ²½μ°, cur μνμ± νκ΄΄
else if(plus>cur){
idx++;
queue.addFirst(plus); // λ€μ queueμ μ μ₯
break;
}
}
// μμκ° μλ κ²½μ°, λ€μ μμκΉμ§ μμ μνμ±λ€μ μ΄μ λ¨μ
if(queue.isEmpty()){
idx=addMinus(idx,asteroids);
}
}
}
1. [μμ, μμ] μμμΌ λλ§ μΆ©λμ΄ λ°μνκΈ° λλ¬Έμ μμκ° λμ¬ λκΉμ§ queueμ μμλ€μ μ μ₯νλ€.
`queue.addFirst()`λ‘ μ½μ ν΄μΌν¨.
β΅ μΆ©λ μ λμ€μ λ€μ΄μ¨ μμκ° λ¨Όμ μΆ©λνκΈ° λλ¬Έ
2. `cur`μ μμ μ μ₯
3. queueμμ λΉΌλΈ `plus`μ μμ μ μ₯ & μΆ©λ μ²λ¦¬
- `plus < cur`: plus λ°μ΄λκ³ μ°μ μΆ©λ γ±γ±
- `plus == cur`: λ λ€ λ°μ΄
- `plus>cur`: cur λ°μ΄λκ³ , plus λ€μ queueμ λ£κΈ°
4. μΆ©λ ν queueμ λ¨μ μλ μμκ° μλ κ²½μ°, λ€μ μ²μμΌλ‘ λμ€λ μμ μ°ΎκΈ°
5. λ°°μ΄μ λκΉμ§ (1) ~ (4) κ³Όμ λ°λ³΅
μ΄μ λ¨μ μμ μνμ± μ½μ
public static int[] asteroidCollision(int[] asteroids) {
...
while (!queue.isEmpty()) {
list.add(queue.pollLast());
}
return list != null ? list.stream().mapToInt(Integer::intValue).toArray() : new int[0];
}
}
queueλ₯Ό νμ μ μΆ λ°©μμΌλ‘ μ¬μ©νκΈ° λλ¬Έμ, 맨 λ€μ μλ μμλΆν° μ μ₯ν΄μΌνλ€.
λ°ν κ°μ΄ `int[]`μ΄λ―λ‘ listλ₯Ό λ°°μ΄λ‘ λ³νν΄μ λ°ννλ€.
β¨ κ²°κ³Ό
μΆ©λνλ κ²½μ°λ₯Ό 빨리 μκ°ν΄ λ΄μ μ½κ² ν μ μμλ€.
λλ μ μ μ μΆμΈ queueλ₯Ό νμ μ μΆ λ°©μμΌλ‘ μ¬μ©νκ³ , listλ₯Ό int λ°°μ΄λ‘ λ°ννλ κ³Όμ μ κ±°μ³€λ€.
νμ§λ§ μ΄ λ¬Έμ λ, Stackκ³Ό μΆκ°μ μΈ int λ°°μ΄μ μ¬μ©ν΄ ν μ μλ€.
λ κ°λ
μ±μ΄ μ’μ μ½λμ΄λ―λ‘ μλ λ보기 μΉΈμ μ½λλ₯Ό λ£μ΄λκ² λ€.
public static int[] asteroidCollision(int[] asteroids) {
Stack<Integer> stack = new Stack<>();
for(int a :asteroids){
if(a>0){
stack.push(a);
}else{
while(!stack.isEmpty() && stack.peek()>0 && stack.peek()<-a){
stack.pop();
}
if(stack.isEmpty() || stack.peek()<0){
stack.push(a);
}
if(stack.peek()==-a){
stack.pop();
}
}
}
int [] res = new int[stack.size()];
int idx = res.length-1;
while(!stack.isEmpty()){
res[idx--] = stack.pop();
}
return res;
}