티스토리 뷰
사칙연산 스택 계산기
문제
스택 계산기의 원리를 이용해 수식을 분해하고 계산하기 (사칙연산)
1. 식 분할
입출력 예시
입력 | 출력 |
---|---|
3 * 1 | 3 1 * |
7 / 4 * 6 | 7 4 / 6 * |
1 + 2 3 - 4 5 | 1 2 3 + 4 5 - |
9 / 8 * 7 + 6 / 5 | 9 8 / 7 * 6 5 / + |
설명 : 스택 자료구조를 이용해 식을 계산한다.
수식을 읽어들이고 수가 입력되면 그대로 출력, 연산자가 입력되면 스택에 push.
연산자가 스택에 저장된 상태에서 연산자가 입력된다면 둘의 우선순위를 비교해 결정한다.
- 새로 입력된 연산자 우선순위 > 스택 속 연산자의 우선순위 pop 없이 push
- 그 외의 경우 스택 속 연산자를 pop
이를 반복
소스코드
StackCalculatorWithPriority.java
OperatorPriority.java
2. 계산
입출력 예시
입력 | 출력 |
---|---|
3 * 1 | 3 |
7 / 4 * 6 | 10.5 |
1 + 2 3 - 4 5 | -13 |
9 / 8 * 7 + 6 / 5 | 9.075 |
설명 : 1-1에서 분해된 식을 계산한다.
분해된 수식 배열을 하나씩 꺼내어 숫자라면 스택에 push
연산자라면 스택에서 수를 두 개 꺼내어 연산자로 계산, 계산 결과를 다시 스택에 push
소스코드
StackCalculatorWithPriority.java (calculate 메소드 추가, main 함수 내용 추가)
OperatorPriority.java (달라진 점 없음)
3. Enum을 쓴 이유
사실 Enum을 꼭 써야할 필요는 없었다.
나는 몇 개월 전에 우아한형제들 기술 블로그에서 Enum클래스를 활용하는 글(http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html)을을) 본 적이 있었고 당시 이해하기 힘들어서 언젠가 한 번 써봐야 이해가 되겠거니 했었는데 이번 글에서 추가된 우선순위라는 개념과 동일한 우선순위를 갖는 문자가 여러개인 점 (곱셈 나눗셈 vs 덧셈 뺄셈)을 고려했을때 억지스럽긴 해도 한 번 적용해볼만한 가치는 있겠다는 생각이 들어 적용시켰다.
추가로 OperatorProperty클래스에 priority라는 필드를 굳이 선언하지 않고 Enum클래스 객체 내장 메소드인 .ordinal() 메소드를 이용해 비교해도 문제는 없다. 하지만, .ordinal()은 클래스 정의 안에서 선언한 순서에 의존하기 때문에 완전하지 않다고 보고 priority라는 정수형 필드를 추가했다.
글로써 읽을 때에는 진짜 어려웠는데 실제로 적용해보니 그렇게 어려울건 없어서 다행이었다.
조금 어거지로 적용한 것도 같았지만 나름 나쁘지 않았다.
'알고리즘' 카테고리의 다른 글
[자료구조, 알고리즘] 스택 계산기 - 3. 괄호가 있는 사칙연산 계산기 (0) | 2018.03.20 |
---|---|
[자료구조, 알고리즘] 스택 계산기 - 1. 덧뺄셈 계산기 (0) | 2018.03.20 |
- Total
- Today
- Yesterday
- Entity에 VO
- 자료구조
- 우아한테크캠프
- signme
- 스택
- Sign Me
- 알고리즘
- 양방향 연결
- 전공프로젝트
- Java Heap
- 백준 온라인 저지
- @Embdded
- Java 스택 계산기
- uni direction
- 스택 계산기
- 자료구조 Heap
- 우테캠
- @Embeddable
- 자바 힙 구현
- 붕어빵틀과 붕어빵
- bi direction
- 붕어빵틀과붕어빵
- JPA 관계
- 클래스와 객체
- 백준
- 자료구조 힙
- 정렬
- 소프트웨어개발과
- 정렬 알고리즘
- 단방향 연결
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |