๋ฌธ์
์์์ ์ผ๋ฐ์ ์ผ๋ก 3๊ฐ์ง ํ๊ธฐ๋ฒ์ผ๋ก ํํํ ์ ์๋ค. ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๊ฐ์ด๋ฐ ์์นํ๋ ์ค์ ํ๊ธฐ๋ฒ(์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค), ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ์์ ์์นํ๋ ์ ์ ํ๊ธฐ๋ฒ(prefix notation), ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๋ค์ ์์นํ๋ ํ์ ํ๊ธฐ๋ฒ(postfix notation)์ด ๊ทธ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์ค์ ํ๊ธฐ๋ฒ์ผ๋ก ํํ๋ a+b
๋ ์ ์ ํ๊ธฐ๋ฒ์ผ๋ก๋ +ab
์ด๊ณ , ํ์ ํ๊ธฐ๋ฒ์ผ๋ก๋ ab+
๊ฐ ๋๋ค.
์ด ๋ฌธ์ ์์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฐ ํ๊ธฐ๋ฒ์ ํ์ ํ๊ธฐ๋ฒ์ด๋ค. ํ์ ํ๊ธฐ๋ฒ์ ์์์ ๋งํ ๋ฒ๊ณผ ๊ฐ์ด ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ๋ค์ ์์นํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ์ฐ๋ ์ค์ ํ๊ธฐ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ง์
๊ณผ ๊ณฑ์
์ ์ฐ์ ์์์ ์ฐจ์ด๊ฐ ์์ด ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋ก ๊ณ์ฐํ ์ ์์ง๋ง ํ์ ํ๊ธฐ์์ ์ฌ์ฉํ๋ฉด ์์๋ฅผ ์ ์ ํ ์กฐ์ ํ์ฌ ์์๋ฅผ ์ ํด์ค ์ ์๋ค. ๋ํ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ดํธ ๋ฑ๋ ํ์ ์๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด a+b*c
๋ฅผ ํ์ ํ๊ธฐ์์ผ๋ก ๋ฐ๊พธ๋ฉด abc*+
๊ฐ ๋๋ค.
์ค์ ํ๊ธฐ์์ ํ์ ํ๊ธฐ์์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์ด๋ ๋ค. ์ฐ์ ์ฃผ์ด์ง ์ค์ ํ๊ธฐ์์ ์ฐ์ฐ์์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ดํธ๋ก ๋ฌถ์ด์ค๋ค. ๊ทธ๋ฐ ๋ค์์ ๊ดํธ ์์ ์ฐ์ฐ์๋ฅผ ๊ดํธ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด a+b*c
๋ (a+(b*c))
์ ์๊ณผ ๊ฐ๊ฒ ๋๋ค. ๊ทธ ๋ค์์ ์์ ์๋ ๊ดํธ์ ์ฐ์ฐ์ *
๋ฅผ ๊ดํธ ๋ฐ์ผ๋ก ๊บผ๋ด๊ฒ ๋๋ฉด (a+bc*)
๊ฐ ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋ +
๋ฅผ ๊ดํธ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ณ ์น๋ฉด abc*+
๊ฐ ๋๊ฒ ๋๋ค.
๋ค๋ฅธ ์๋ฅผ ๋ค์ด ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด A+B*C-D/E
๋ฅผ ์์ ํ๊ฒ ๊ดํธ๋ก ๋ฌถ๊ณ ์ฐ์ฐ์๋ฅผ ์ด๋์ํฌ ์ฅ์๋ฅผ ํ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
๊ฒฐ๊ณผ: ABC*+DE/-
์ด๋ฌํ ์ฌ์ค์ ์๊ณ ์ค์ ํ๊ธฐ์์ด ์ฃผ์ด์ก์ ๋ ํ์ ํ๊ธฐ์์ผ๋ก ๊ณ ์น๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ค์ ํ๊ธฐ์์ด ์ฃผ์ด์ง๋ค. ๋จ ์ด ์์์ ํผ์ฐ์ฐ์๋ ์ํ๋ฒณ ๋๋ฌธ์๋ก ์ด๋ฃจ์ด์ง๋ฉฐ ์์์์ ํ ๋ฒ์ฉ๋ง ๋ฑ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ -A+B
์ ๊ฐ์ด -
๊ฐ ๊ฐ์ฅ ์์ ์ค๊ฑฐ๋ AB
์ ๊ฐ์ด *
๊ฐ ์๋ต๋๋ ๋ฑ์ ์์์ ์ฃผ์ด์ง์ง ์๋๋ค. ํ๊ธฐ์์ ์ํ๋ฒณ ๋๋ฌธ์์ +
, -
, *
, /
, (
, )
๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ธธ์ด๋ 100์ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ํ๊ธฐ์์ผ๋ก ๋ฐ๋ ์์ ์ถ๋ ฅํ์์ค
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋งํ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
2 ์ด | 128 MB | 43207 | 16021 | 12106 | 36.735% |
https://www.acmicpc.net/problem/1918 |
ํ์ด
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
Stack
์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ์ค์ํ๊ธฐ์์ ํ์ํ๊ธฐ์์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฌธ์ ์ด๋ค.
ํต์ฌ์ ์คํ์๋ ์ฐ์ฐ์๋ง ์ฌ์ฉํ๊ณ , ํผ์ฐ์ฐ์๋ ๋ฐ๋ก ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค
- ์ฐ์ฐ์์ ์ฐ์ ์์๋ฅผ ์ง์ ํ์ฌ stack์ ๋ฃ๊ธฐ ์ ์, ํ์ฌ ์ฐ์ฐ์์ ์ฐ์ ์์๋ณด๋ค ํฐ ์ฐ์ฐ์๊ฐ stack์ ๋งจ ์์ ์๋ค๋ฉด, ์์ ๋๊น์ง pop ํ๋ค. (์ฐ์ ์์ ์์ผ๋ก ๊ณ์ฐ๋์ด์ผ ํ๋ฏ๋ก)
)
์ผ ๊ฒฝ์ฐ์(
๊ฐ ๋์ฌ๋๊น์ง stack์์ ์ฐ์ฐ์๋ฅผ pop ํ๋ค.- ํผ์ฐ์ฐ์๋ ๋ฐ๋ก ์คํ์ ๋ฃ์ง ์๊ณ ๋ฐ๋ก
StringBuilder
์ append ํด์ค๋ค.
์ฐจ๋๊ธฐ์ง ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋งค์ฐ ์ ์ฌํ ๋ฌธ์ ์ด๋ฏ๋ก ์ฐธ๊ณ ๋ฅผ ํด๋ณด๋ฉด ์ข์๊ฒ ๊ฐ๋ค.
์ฝ๋
public class ํ์ํ๊ธฐ์ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String str = br.readLine();
Stack<Character> stack = new Stack<>(); //์คํ์ ์ ์ธ(์ฐ์ฐ์๋ฅผ ๋ด๋๋ค) - ๋ค์์ ๋ถํฐ
for(int i=0; i < str.length(); i++){
char now = str.charAt(i);
switch (now){
case '+':
case '-':
case '*':
case '/':
//(๋ฐ๋ณต) ์คํ์ ์ต์์ ์ฐ์ ์์๊ฐ ํ์ฌ์ ์ฐ์ ์์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์๋,
//์คํ์์ ๊ฐ์ ์ถ๋ ฅํ๋ก ์ฎ๊ฒจ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ฐ์ฐ์๋ฅผ ์คํ์ ๋ฃ๋๋ค.
while (!stack.isEmpty() && priority(stack.peek()) >= priority(now)){
sb.append(stack.pop());
}
stack.add(now);
break;
case '(':
//์ฌ๋ ๊ดํธ๋ฅผ ๋ง๋๋ฉด, ์คํ์ ๋ฃ์ด์ค๋ค.
stack.add(now);
break;
case ')':
//๋ซ๋ ๊ดํธ๊ฐ ๋์ค๋ฉด ์ฌ๋ ๊ดํธ๊ฐ ๋์ฌ๋๊น์ง ์ถ๋ ฅํ์ ๋ฃ์ด์ฃผ๊ณ , ์ฌ๋ ํ๋ฅผ ์ญ์ ํ๋ค.
while (!stack.isEmpty() && stack.peek() != '('){
sb.append(stack.pop());
}
stack.pop(); //์ฌ๋ํ ์ญ์
break;
default:
sb.append(now); //๋ฌธ์๊ฐ ๋์ค๋ฉด ๋ฐ๋ก ์ถ๋ ฅํ๋ก ๋ฃ์ด์ค๋ค.
}
}
while (!stack.isEmpty()) { //์๋จ์ for๋ฌธ์ด ๋๊ณ ์คํ์ ๋จ์์๋ ์ฐ์ฐ์๋ฅผ ์ถ๋ ฅํ๋ก ์ฎ๊ฒจ์ค๋ค.
sb.append(stack.pop());
}
System.out.println(sb);
br.close();
}
public static int priority(char op){ //์ฐ์ ์์๋ฅผ ์ ํด์ค๋ค.
if(op == '(' || op == ')'){
return 0;
}else if (op == '+' || op == '-'){
return 1;
}else if (op == '*' || op == '/'){
return 2;
}
return -1;
}
}