728x90

문제설명

입력 & 출력

나의 풀이

문제 접근 방법

"백준 - 잃어버린 괄호"문제는 주어진 식에 적절히 괄호를 넣었을 때 최소의 값을 만드는 문제입니다. 

 

연산자는 '+'와 '-'만 주어지기 때문에 최소 값을 만드려면 마이너스 값이 최대한 커야합니다. 즉, 가장 큰 수를 빼줘야 합니다.

 

 

위와 같이 가장 큰 수를 만드려면 50 + 40 = 90 을 통해 가장 큰 값을 구할 수 있습니다. 여기서 알 수 있듯이 덧셈(+)으로 이루어진 수먼저 더하면 큰 값을 구할 수 있습니다.


100+200-300+400-500+600+700-800+900+1000-1100+1200

 

위와 같이 긴 연산이 주어진다고 해도 뺄셈(-)을 기준으로 분리하면 아래와 같이 나옵니다.

 

1. ["100+200", "300+400", "500+600+700", "800+900+1000", "1100+1200"]

2. 12345-54321+67890-98765+11111+22222-33333+44444

3. -32655

 

그러면 각 그룹에 대해서 큰 수가 구해지고, 그룹을 연산을 해주고, 뺄셈(-)을 해준다면 가장 작은 값을 구할 수 있습니다.

 

이 때 첫번째 값은 항상 양수인 점을 주의해야합니다. 따라서 각 그룹에 대해 + 연산을 먼저 수행하여 그룹별 합계를 구한 후, 첫 번째 그룹은 결과에 더하고 나머지 그룹들의 합은 결과에서 차례로 빼주면 최종적으로 가장 작은 값을 구할 수 있습니다.

 

 

전체 코드

 

먼저 BufferedReader 클래스로 입력을 받아주고, StringTokenizer 클래스로 입력을 "-"를 기준으로 토큰으로 분리해줍니다.

 

앞서 말했듯이 첫 번째 값은 항상 양수이기 때문에 최종 값에 먼저 더해줍니다. 그리고 이후 값들은 더해주어서 큰 값을 만들어주고, 첫 번째 값에서 차례대로 빼주면 최소의 값이 도출됩니다.

 

 

주의해야할 점

55-50+40

 

위와 같은 입력이 주어진다면, 그룹은 "[55, 50 + 40]" 으로 나누어집니다.

10+20+30+40

 

그러나 위와 같이 "-"가 없는 입력이 주어질 수 있습니다. 이 때 그룹은 "[10 , 20, 30, 40]" 으로 나누며, 실제로는 - 연산이 없어도 동일한 방식으로 분리됩니다.

 

따라서 첫 번째 값을 최종 값(reuslt)에 넣어줄 때도, "+"를 기준으로 분리를 해줘야합니다.

 

따라서 result를 초기값으로 넣을 때도 "+"연산자를 분리해줘야 합니다.

 

result를 초기값으로 설정하거나 각 연산을 수행할 때 + 연산자를 기준으로 값을 분리하지 않으면, NumberFormatException 예외가 발생할 수 있습니다. 이는 + 또는 -가 포함된 문자열정수로 변환하려고 할 때 발생하는 문제입니다.

 

따라서 입력을 처리할 때 + 연산자를 기준으로 값을 분리한 후, 정수로 변환하여 계산해야 안전하게 동작합니다.