잃어버린 괄호 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율
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 |