1. ๋ฌธ์ ์ค๋ช
1874 ์คํ์์ด ๋ฌธ์ ์ค๋ช
- 1~N๊น์ง ์ค๋ฆ์ฐจ์์ผ๋ก ์คํ์ ํ๋์ฉ ์ง์ด๋ฃ๋๋ค.
- ์คํ์ ํ๋์ฉ ๋ค์ด์ฌ ๋, ์ ์ ํ POPํ์ฌ, ๋ฌธ์ ์์ ์ํ๋ ์์ด์ ๋ง๋ค ์ ์๋์ง ๊ตฌํ๋ผ
- ๋ง๋ค ์ ์๋ค๋ฉด PUSH = + , POP = - ๋ก ๊ทธ๊ฐ ํด์๋ ๋ช
๋ น์ด๋ฅผ ์ถ๋ ฅํ๊ณ ,
๋ง๋ค ์ ์๋ค๋ฉด NO๋ฅผ ์ถ๋ ฅํ๋ผ
2. ๋ฌธ์ ํธ๋ ๋ฐฉ๋ฒ
A. ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ (STACK ์๋ฃ ๊ตฌ์กฐ ์ด์ฉ)
(1) ๋ต์ด ๋๋ ์์ด(์ดํ ans)๊ณผ ์คํ์ ์ ๋ ฅํ๋ ์์์ธ ์ค๋ฆ์ฐจ์ ์์ด(์ดํ arr)์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
(2) ๋ ๋ค ์ง์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
ans์ ์ง์์๋ฅผ ansIndicator, arr์ ์ง์์๋ฅผ arrIndicator๋ผ๊ณ ํ ๋,
โ a. arrIndicator๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ๊ฒ์ด ansIndicator๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด stack์ arrIndicator๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ๊ฒ์ Pushํ๊ณ arrIndicator๋ฅผ ํ๋ ์ฌ๋ฆฐ๋ค.
b. Stack์ ๋งจ ๊ผญ๋๊ธฐ ๊ฐ๊ณผ ansIndicator๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด, Stack ๊ผญ๋๊ธฐ ๊ฐ์ popํ๊ณ ansIndicator๋ฅผ ํ๋ ์ฌ๋ฆฐ๋ค.
c. ๋ง์ฝ Stack ๊ผญ๋๊ธฐ์ ๊ฐ์ด ansIndicator๋ณด๋ค ํฌ๋ฉด, Stack์์ ์๋ฌด๋ฆฌ POPํด๋ ์ํ๋ ์์ด์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์, NO๋ฅผ ์ถ๋ ฅ ํ๋ค.
B. ๋ ๋ฒ์จฐ ๋ฐฉ๋ฒ (๋ฐฐ์ด์ ์คํ์ฒ๋ผ ์ด์ฉ)
[๋ณ์์ ๋ํ ์ค๋ช ]
a. top = Stack์ Peek๋ฅผ ๊ฐ๋ฅดํค๋ ๊ฒ์ ๋ฐฐ์ด์์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ณ์๋ก, ๋ฐฐ์ด์์ ์ ์ผ ์ต๊ทผ์ ๋ค์ด์จ ๊ฐ์ ์ง์นญํ๋ ๋ณ์์ด๋ค.
b. index = ๋ต์ด ๋ ์์ด์ ํน์ ์์๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋ ์ง์์์ด๋ค.
[๋ฌธ์ ํธ๋ ๋ฐฉ๋ฒ]
(1) for๋ฌธ์ 1 ~ N ๊น์ง ๋๋ค.
(2) stack์ ์ผ๋จ ํ๋ ์ง์ด ๋ฃ๋๋ค.
(3) ๋ค์ while ๋ฌธ ๋๋ฉด์ stack์ top๊ณผ index๊ฐ ๊ฐ๋ฅดํค๊ณ ์๋ ans์ ์์๊ฐ ๊ฐ์์ง ํ์ธํ๋ค.
(4) ๋ง์ฝ ๊ฐ๋ค๋ฉด, top-- (popํ๊ณ ๊ทธ ๋ฐ์๊ฑธ ๊ฐ๋ฅดํค๋ ๊ฒ์ ์๋ฏธ), index++ (๋ค์ ์์๋ฅผ ๊ฐ๋ฅดํค๋ ๊ฒ์ ์๋ฏธ) ํ๋ค.
(5) 1~n๊น์ง ๋ค ๋๊ณ ๋๋ฉด, stack์ ์์ฌํด ์๋ ๋๋จธ์ง ๊ฐ๋ค์ ๋ํด์ (4)๋ฅผ ํ๋ฒ ๋ํ๋ค.
(6) ๊ทผ๋ฐ ๋ง์ฝ์ (5)๋ฅผ ํ๋๋ฐ๋ Stack์ ์์ฌํด ์๋ ๊ฐ์ด ๋จ์์๋ค๋ฉด, ๋ต์ด ๋๋ ์์ด์ ๋ชป ๋ง๋ ๋ค๋ ์๋ฆฌ๊ฐ ๋๋ฏ๋ก, NO๋ฅผ ์ถ๋ ฅํ๋ค.
3. ์ฝ๋ ๋ถ์
A. ์ฒซ ๋ฒ์จฐ ๋ฐฉ๋ฒ์ ๋ํ ํ์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/*
* 1874๋ฒ ์คํ ์์ด
* */
public class Main {
static int N;
static int [] ans;
static int [] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 1. ์
๋ ฅ ๋ฐ๊ธฐ---------------------------------------------------------------
N = Integer.parseInt(br.readLine());
arr = new int [N];
ans = new int [N];
for (int i = 1; i <= N; i++) {
arr[i-1] = i;
ans[i-1] = Integer.parseInt(br.readLine());
}
StringBuilder sb = new StringBuilder();
Stack<Integer> stack = new Stack<>();
// 2. ๋ฐฐ์ด๊ณผ ๋ต์ ๊ฐ์ ๋น๊ตํด์, ๋ฐฐ์ด <= ๋ต์ด๋ฉด, ๋ฐฐ์ด์ ํ์์๋ฅผ ํ๋์ฉ ์ฌ๋ฆฌ๋ฉด์, [stack]์ ์ง์ด๋ฃ๋๋ค.
// 3. stack.peek() == ๋ต์ด๋ฉด, stack ์์ pop ํ๊ณ , ๋ต์ ํ์์๋ฅผ ํ๋ ์ฌ๋ฆฐ๋ค.
// 4. stack.peek() > ๋ต์ด๋ฉด NO๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ค.
int ansIndicator = 0;
int arrIndicator = 0;
while (ansIndicator < N) {
while (arrIndicator < N && arr[arrIndicator] <= ans[ansIndicator]){
sb.append("+\n");
stack.push(arr[arrIndicator]);
arrIndicator++;
}
while (!stack.isEmpty() && stack.peek() == ans[ansIndicator]){
stack.pop();
sb.append("-\n");
ansIndicator++;
}
if(!stack.isEmpty() && stack.peek() > ans[ansIndicator]){
System.out.println("NO");
return;
}
}
System.out.println(sb);
}
}
B. ๋ ๋ฒ์จฐ ๋ฐฉ๋ฒ์ ๋ํ ํ์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/*
* 1874๋ฒ ์คํ ์์ด
* */
public class Main {
static int [] ans;
public static void main(String[] args) throws IOException {
// 1. ๊ฐ ์
๋ ฅ ---------------------------------------------------------
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
ans = new int [N];
for (int i = 0; i < N; i++) {
ans[i] = Integer.parseInt(br.readLine());
}
// [stack]์ ๋ฐฐ์ด๋ก ๊ตฌํ
int [] stack = new int [N];
// top์ Stack์ ์ง์์, stack ๋ฐฐ์ด์ ๊ฐ์ด ์ฐฐ์๋ก ์ฌ๋ฆผ. -> ๋บ ๋๋ง๋ค ๋ด๋ฆผ
int top = -1;
StringBuilder sb = new StringBuilder();
int index = 0;
// stack ์ ๊ฐ ๋ฃ์ผ๋ฉด์ ๋ฐ๋ก๋ฐ๋ก
for (int i = 1; i <= N; i++) {
// 1) ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด stack์ ์ค๋ฆ์ฐจ์์ผ๋ก ๊ฐ์ push ํ๋ค.
stack[++top] = i;
sb.append("+\n");
// 2) stack์ ๊ฐ์ด ์กด์ฌํ๊ณ , stack์ ํ์ด๋ ๋ฝ์์ผํ ๊ฐ์ด๋ ๊ฐ์ผ๋ฉด POPํ๋ค.
while (top != -1 && stack[top] == ans[index]){
top--; // ์ง์์ ํ ๋จ๊ณ ๋ด๋ฆฌ๊ธฐ pop์ ๊ตฌํํ ๊ฒ
index++; // ์ง๊ธ ๋ต์ ์ด์ ํด๊ฒฐ ํ์์ผ๋ก ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค.
sb.append("-\n"); // ๊ฐ ๋ฃ๊ธฐ
}
}
// 3) Stack์ด empty๊ฐ ์๋๊ณ , stack์ peek์ด ๋ต์ ๊ฐ๊ณผ ๊ฐ์ผ๋ฉด pop
while (top != -1 && stack[top] == ans[index]){
top --;
index ++;
sb.append("-\n");
}
// 4) 3๋ฒ์์ [stack]์ peek ๊ณผ ํ์ฌ ์ถ๋ ฅํด์ผ ํ๋ ๋ต ๋ถ๋ถ์ด ์ด๊ธ๋๋ฉด ํด๋น ๋ฌธ์ ๋ ํ ์ ์๋ ๋ฌธ์ ์ด๋ฏ๋ก
// stack ๋ฐฐ์ด์ ๋งจ ์๋๊น์ง ๋ณด์ง ์์ ์ฑ, while loop๋ฅผ ๋๊ฐ๋ค.
// ๋ฐ๋ผ์ top์ด ๋งจ ๋ฐ๋ฐ๋ฅ์ธ -1๊น์ง ์ค์ง ์์ผ๋ฉด NO๋ฅผ ์ถ๋ ฅํ๋ค.
System.out.println(top == -1? sb : "NO");
}
}