티스토리 뷰

백준/백준 - 스위프트

1541번: 잃어버린 괄호

강철곰탱이 2023. 11. 22. 01:25
 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

 

잃어버린 괄호 

 

문제

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

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

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

입력

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

출력

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

예제 입력 1 

55-50+40

예제 출력 1 

-35

 


풀이 

 

 

문제를 확인해보자.

 

  • 양수, +, - 가 있는 식에서 괄호를 적절히 사용하여 식의 값을 최소로 만들어라.

 

여기서 중요하게 생각해야하는게 바로 "괄호"이다.

 

처음 내 생각

 

 

처음에 생각한 건 (-)는 음수, (+)는 양수로 저장하여 dp로 탐색을 하면서 최솟값을 구하려했다.

 

let input: String = readLine()!

var arr: [Int] = []
var num:String = ""

for inputValue in input{
    
    if inputValue == "-" {
        arr.append(Int(inputValue))
        num = ""
    }
    
    if inputValue == "+"{
        arr.append(Int(inputValue))
        print(num)
        num = ""
    }
    else{
        num = num + String(inputValue)
    }
}

print(num)

 

예를들어, 예제1의 입력값 55-50+40을 입력하면 [55,-50,40]의 값을 배열에 저장한다.

그리고 dp로 배열에 저장된 값을 더하면서 가장 최소가 되는 값을 구하려고 했는데, 여기서 오류가 있다.

 

"괄호"가 중요하다고 했는데, dp로 저장된 값을 더하게되면 55-(50+40)과 같이 괄호를 넣은 값을 구할 수 없다.

 

 

 


설계

 

이제 괄호의 중요성을 알게되었다. 어떻게 구현할까?

 

먼저, 다음과 같은 경우를 생각해보자.

 

55-50+40-30+20+10

 

 

  • 초록색(-)는 빨간색(-)를 만나기 전까지의 합을 더하는 것이 최솟값이 된다. => -(50+40)
  • 빨간색(-)도 마지막 숫자까지 더한 값이 최솟값이 된다. => -(30+20+10)

 

즉, (-)가 있을 때 다음(-)를 만나기 전까지 값들을 모두 더해주고 결과값에서 빼면 된다.

 

 


구현

 

55-50+40-30+20+10

 

위의 예제를 생각해보자.

 

 

1. "-" 구분하여 입력받기

 

let input = readLine()!.split(separator: "-").map({String($0)})

 

  • input = [55, 50+40, 30+20+10]

 

 

2. "+" 구분하여 입력받기

 

for i in 0..<input.count{
    let n = input[i].split(separator: "+").map({Int(String($0))!})

    ...
}

 

i 0 1 2
n [55] [50,40] [30,20,10]

 

 

3. 초기값 세팅

 

첫번째 값은 항상 양수이기때문에 i=0일 때, n 값을 다 더한다.

 

 

4. 최솟값 탐색

 

i!=0이라면, (-)를 가진 값이니 해당 n 값들을 다 더한 후 결과값에서 빼준다. 

 

 


전체코드

 

let input = readLine()!.split(separator: "-").map({String($0)})

var arr: [Int] = []

var result = 0


for i in 0..<input.count{
    let n = input[i].split(separator: "+").map({Int(String($0))!})

    if i==0{
        result += n.reduce(0, +)
    }
    else{
        result -= n.reduce(0, +)
    }
}
print(result)

 

 

'백준 > 백준 - 스위프트' 카테고리의 다른 글

1260번: DFS와 BFS  (0) 2023.12.06
1931번: 회의실 배정  (0) 2023.11.28
1713번: 후보 추천하기  (0) 2023.11.15
11403번: 경로찾기  (0) 2023.11.13
14567번: 선수과목  (0) 2023.11.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함