본문 바로가기

Algorithm

[스택/큐2] 기능개발, 주식가격, 계산기

기능개발

조건에 맞는 값들을 queue에 쌓아두고

while문을 이용하여 모두 제거하는 식의 문제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function solution(progresses, speeds) {
    var answer = [];
    let counter = 0;
    while(progresses.length) {
        for(let i = 0; i<progresses.length; i++){
            progresses[i] += + speeds[i]
        }
        while(progresses[0>= 100){
            progresses.shift();
            speeds.shift();
            counter++
        }
        if(counter) {
            answer.push(counter);
            counter=0;
        }
    }
    return answer;
}
 

주식가격

설명 없음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string>
#include <vector>
#include <iostream>
using namespace std;
 
vector<int> solution(vector<int> prices) {
    vector<int> answer;
    for(int i =0; i<prices.size(); i++) {
        int count = 0;
        for(int j=i; j<prices.size(); j++) {
            if(prices[i] > prices[j]){
                answer.push_back(count);
                break;
            }
            if(j == prices.size()-1) {
                answer.push_back(count);
                break;
            }
            count++;
        }
    }
    return answer;
}
 

계산기

문자열로 입력된 수식을 연산하고 결과값을 출력하는 코드를 작성하시오. (eval 사용 금지)

input: "1+7*(15-1)/2"

output: 50

 

스택의 난이도 있는 문제이다.

스택의 어려움은 조건이 많기 때문인데 사칙연산은 순서에 있어서 많은 조건이 있기 때문이다.

 

계산 방법은

현재의 중위 표기법으로 된 식을 후위 표기법으로 바꾼 후 계산한다.

그렇기 때문에 크게 두가지 코드로 나누었다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
const question = "1+7*(15-1)/2"
const stack = []
const output = []
function postfix(question) {
    const arr = []
    let tempNum = ""
    for(let index in question) {
        
        let nowNumCheck = question[index].match(/[0-9]/)
        
        if(arr.length) {
            let lastNumCheck = arr[arr.length-1].match(/[0-9]/)
            if(lastNumCheck && !nowNumCheck) {
                arr.push(question[index])
            }else if(!lastNumCheck && nowNumCheck){
                arr.push(question[index])
            }else if(!lastNumCheck && !nowNumCheck) {
                arr.push(question[index])
            }else{
                tempNum = arr.pop() + question[index]
                arr.push(tempNum)
                    
            }
        }else {
            arr.push(question[index])
 
        }
    }
    
    for(value of arr) {
        if(!value.match(/[0-9]/)) {
            if(!stack.length) {
                stack.push(value)
            }else{
                if(value == "(") {
                    stack.push(value);
                }
                if(value == ")") {
                    while(stack.length) {
                        let target = stack.pop()
                        if(target != "(") {
                            output.push(target)
                        }else{
                            break;
                        }
                        
                    }
                    if(output[output.length-1== "+" || output[output.length-1== "-") {
                        while(true){
                            if(stack[stack.length-1== "*" || stack[stack.length-1== "/") {
                                output.push(stack.pop());
                            }else{
                                break;
                            }
                        }
                    }
                }
                if(stack.indexOf("(">= 0) {
                    if(value != "(")
                        stack.push(value);
                }else{
                    if(value == "+" || value == "-") {
                        if(
                            stack[0== "*" ||
                            stack[0== "/" || 
                            stack[0== "+" || 
                            stack[0== "–" ) {
                            for(let i =0; i<stack.length; i++) {
                                output.push(stack.pop())
                            }
                            stack.push(value);
                        }
                    }
                    if(value == "*" || value == "/") {
                        if(stack[0== "*" || stack[0== "/") {
                            output.push(stack.pop())
                            stack.push(value);
                        }else if(stack[0== "+" || stack[0== "-") {
                            stack.push(value);
                        }
                    }
                }
                }
        }else{
            output.push(value)
        }
    }
    while(stack.length) {
        output.push(stack.pop());
    }
}
 
postfix(question)
 

위 코드는 후위표기식을 작성하는 코드이다.

후위 표기식 조건은

1. 현재 타겟이 ( 일 경우에는

1-1. 타겟이 ) 이전까지의 모든 연산자를 스택에 입력한다.

1-2 타겟이 ) 일 경우 괄호안의 모든 연산자를 pop 하여 후위표기식에 입력한다.

 

2. 현재타겟이 (가 아닐 경우는

2-1. + 혹은 - 가 타겟 일떄

2-1-1. 만약 이전 값이 + - * / 일 경우 스택에 담겨진 모든 연산자를 pop하여 후위표기식에 넣는다.

2-2 * 혹은 -가 타겟일 때

2-2-1. 스택의 top이 * 혹은 / 라면 스택의 모든 * 와 / 를 pop하여 후위표기식에 넣는다.

2-2-2 스택의 top이 + 혹은 - 라면 스택에 해당 타겟을 push한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function calculator(output){
    const outputArr = output
    for(value of outputArr) {
        if(value.match(/[0-9]/)) {
            calStack.push(value)
        }else{
            let a = Number(calStack.pop())
            let b = Number(calStack.pop())
            if(value=="+") calStack.push(b + a)
            if(value == "-") calStack.push(b - a)
            if(value == "*") calStack.push(b * a)
            if(value == "/"Math.round(calStack.push(b / a))
        }
    }
    return calStack[0]
}
 
 

위 코드는 후위표기식을 받아 계산한다.

타겟이 숫자일 경우에는 stack에 담고

타겟이 연산자일 경우 stack에서 숫자를 pop 하여 연산해 push 한다.

'Algorithm' 카테고리의 다른 글

탐욕법  (0) 2019.08.06
[DFS/BFS] 여행경로  (0) 2019.07.28
[스택/큐] 프린터, 탑, 쇠막대기, 다리를 지나는 트럭  (0) 2019.07.26
[DP] 가장 큰 정사각형 찾기/ 땅따먹기  (0) 2019.07.19
[완전탐색] 소수 찾기  (0) 2019.07.17