알고리즘 공부/파싱

백준 1541번 with Kotlin

_우지 2021. 8. 1. 11:53

잃어버린 괄호 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율

2 초 128 MB 30648 14428 11655 47.100%

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.

예제 입력 1 복사

55-50+40

예제 출력 1 복사

-35

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
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.*
import kotlin.math.pow
/*
이 문제는 괄호를 쳐서 최솟값을 구하는 문제인데, 처음에는 문제가 잘 이해가 되지 않아서 난감했습니다.
예시로 주어진 55 - 50 + 40 은 55 - ( 50 + 40 ) = -35 라는 최솟값을 얻을 수 있었습니다.
생각해본 결과 -부호가 나온 순간부터 모든수를 빼주어야 한다는 결과를 생각했습니다.
예를 들어 30-60+40-60+40+30 이란 식이 있을때 -가 나온 순간부터 이 식은 30-60-40-60-40-30 으로 바뀔 수 있으며,
그러므로 최솟값을 얻을 수 있었습니다.
1. queue를 사용해서 숫자들을 모두 queue에 char를 Int로 형 변환해서 넣어줍니다.
2. w=='-' 또는 w=='+' 인 경우 queue에 있는 수를 로직에따라 sum에 더하거나 빼줍니다.
3. 이때 s.poll()*((10.0).pow(s.size)).toInt() 를 사용해서 백의자리 십의자리 일의자리를 구분해서 더합니다.
4. 위에서 말한대로 -부호가 나오면 이제 sum에 -=를 사용해서 queue안에 있는 수는 이제 모조리 빼줍니다.
 */
 
val br = BufferedReader(InputStreamReader(System.`in`))
 
fun main()=with(br){
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    val line = readLine()
    var s : Queue<Int> = LinkedList<Int>()
    var sum = 0
    var key = true
    for(w in line){
        if(w=='+'){
            if(key){
                while(!s.isEmpty()){
                    sum+=(s.poll()*((10.0).pow(s.size)).toInt())
                }
            }
            else{
                while(!s.isEmpty()){
                    sum-=(s.poll()*((10.0).pow(s.size)).toInt())
                }
            }
        }
        else if(w=='-'){
            if(key){
                while(!s.isEmpty()){
                    sum+=(s.poll()*((10.0).pow(s.size)).toInt())
                }
            }
            else{
                while(!s.isEmpty()){
                    sum-=(s.poll()*((10.0).pow(s.size)).toInt())
                }
            }
            key=false
        }
        else
            s.add(w.toInt()-48)
        //println(s)
        //println(sum)
    }
    if(key){
        while(!s.isEmpty()){
            sum+=(s.poll()*((10.0).pow(s.size)).toInt())
        }
    }
    else{
        while(!s.isEmpty()){
            sum-=(s.poll()*((10.0).pow(s.size)).toInt())
        }
    }
    println(sum)
    bw.flush()
    bw.close()
}
 
cs