-
[ 알고리즘 ] 백준 1918번 후위표기식프로그래밍/알고리즘 2019. 5. 2. 15:52
백준 1918번 후위표기식
이 문제는
Stack
을 이용하는 문제로 평소 학교 공부에서도 많이 풀어보았다고, 생각해서 쉽게 풀 수 있을 것이라 생각했는데 쉽지 않았다.결국은 다른 사람의 답을 참고하여 해결하였다.
생각해보니 평소에는 후위표기식으로 표현된 식을 계산하는 문제를 많이 풀어보았지, 주어진 식을 후위표기식으로 변환을 시키는 코드를 짜본 적은 없는 것 같다.
문제 풀이
입력받은 문자열을 차례로 비교하는데 총 네가지의 경우가 있다.
- 알파벳
- 연산자
- 열린 괄호
- 닫힌 괄호
각 경우에 따라서 출력하거나 스택에 넣거나, 스택에 있는 것을 꺼내주는 식으로 해결한다.
먼저
알파벳인 경우에는 그냥 바로 출력해준다. 나는 그냥
StringBuilder
를 하나 만들어서 거기다 계속append
해줬다.연산자인 경우 :
연산자인 경우가 조금 복잡한데 이 문제에서 연산자는 아래의 네가지가 나온다.
+
,-
,*
,/
여기서 곱하기와 나누기는 더하기와 빼기보다 우선순위가 높기 때문에precedenceMap
이라는 것을 만들어 주어서 그 안에 우선순위값을 저장해놓고 비교해주었다.
이 후, 연산자가 들어왔을 때는 이 때stack
이 비었거나stack
의top
이 열린 괄호, 즉(
이거나stack
의top
보다 지금 들어오는 연산자의 우선순위가 더 높을 때
stack
에 연산자를push
해준다.위에 해당하지 않는 경우에는 해당될 때까지
top
을pop
해준다음 값을push
해준다.열린괄호인 경우에는 바로
stack
에push
한다.닫힌괄호인 경우에는
stack
의top
이 열린괄호 이거나stack
이 빌 때까지pop
하여 출력해준다.
위의 방법을 이용해 모든 문자열을 탐색하고 나면, 마지막으로
stack
내부에 남아있는 값을 출력해준다.
설명이 조금 복잡하지만 이 분의 영상을 보면 이해가 빠르다.
내가 짠 코드
package Algorithms; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Stack; /** * https://www.acmicpc.net/problem/1918 * 백준 1918 후위표기 */ public class Baekjoon1918 { private static Map<Character, Integer> precedenceMap = new HashMap<>(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine().trim(); initPrecedenceMap(); Stack<Character> stack = new Stack<>(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); //알파벳 if(Character.isAlphabetic(c)){ sb.append(c); continue; } // 여는 괄호일 때 if(c =='('){ stack.push(c); continue; } //닫는 괄호일 때 if(c==')'){ while(!stack.isEmpty() && stack.peek() != '('){ sb.append(stack.pop()); } if(!stack.isEmpty() && stack.peek() == '('){ stack.pop(); } continue; } //연산자 일때 while(!stack.isEmpty() && ( precedenceMap.get(stack.peek()) >= precedenceMap.get(c))){ sb.append(stack.pop()); } stack.push(c); } while(!stack.isEmpty()){ sb.append(stack.pop()); } System.out.println(sb.toString()); } private static void initPrecedenceMap() { precedenceMap.put('+', 1); precedenceMap.put('-', 1); precedenceMap.put('*', 2); precedenceMap.put('/', 2); } }
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[ 알고리즘 ] 백준 3078번 좋은친구 (0) 2019.05.03 [ 알고리즘 ] 백준 1935번 후위표기식 2 (0) 2019.05.02 [알고리즘] 백준 2667번 단지번호붙이기 ( BFS ) (0) 2019.03.26 [알고리즘] 알고스팟 소풍 PICNIC (0) 2019.03.22 [알고리즘] 알고스팟 BOARDCOVER 게임판 덮기 문제 (0) 2019.03.22