๐ ๋ฌธ์
- ํ์ฑ์ ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๋ํ๋ด๋ ์ ์ ๋ฐฐ์ด(`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;
}