문제설명
입력 & 출력
나의 풀이
문제 접근 방법
"백준 - 잃어버린 괄호"문제는 주어진 식에 적절히 괄호를 넣었을 때 최소의 값을 만드는 문제입니다.
연산자는 '+'와 '-'만 주어지기 때문에 최소 값을 만드려면 마이너스 값이 최대한 커야합니다. 즉, 가장 큰 수를 빼줘야 합니다.
위와 같이 가장 큰 수를 만드려면 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 예외가 발생할 수 있습니다. 이는 + 또는 -가 포함된 문자열을 정수로 변환하려고 할 때 발생하는 문제입니다.
따라서 입력을 처리할 때 + 연산자를 기준으로 값을 분리한 후, 정수로 변환하여 계산해야 안전하게 동작합니다.
'Coding Test > 백준' 카테고리의 다른 글
[백준, 1912번] 연속합 (다이나믹 프로그래밍, DP, 수열, Java) (0) | 2024.12.21 |
---|---|
[백준, 1932번] 정수 삼각형 (DP, 다이나믹 프로그래밍, Java) (1) | 2024.12.20 |
[백준, 1874번] 스택 수열 (스택, 수열, Java) (1) | 2024.12.20 |
[백준 , 11053번] 가장 긴 증가하는 부분 수열 (수열, 동적계획법, 다이나믹 프로그래밍 DP, Java) (1) | 2024.12.18 |
[백준, 1931번] 회의실 배정 (그리디 알고리즘 greedy, Java) (0) | 2024.12.17 |