(Algorithm)백준1541번_잃어버린 괄호
[백준] 1541: 잃어버린 괄호(JAVA)
문제 링크
예제
1번 예제
- 입력: 55-50+40
- 출력: -35
55-(50+40)
과 같이 괄호를 쳐주면 예제에서 주어지는 식의 값을 최소로 만들 수 있다.
2번 예제
- 입력: 10+20+30+40
- 출력: 100
-
연산자가 존재하지 않아, 있는 그대로 식을 계산하면 된다.
풀이
접근 방법
- 중요 키워드:
이 식의 값을 최소로 만들려고 한다.
- 값을 최소로 만들기 위해서는 어떻게 해야하는지만 생각할 수 있으면 쉽게 문제를 해결할 수 있다.
- 값을 최소로 만들기 위해서는 가장 큰 수를 빼주면 된다. 덧셈 부분을 먼저 계산한 후에 빼주면 끝.
풀이 순서
- 뺄셈 연산자를 기준으로 문자열을 분리해준다.
- 분리된 문자열에 있는 수를 전부 더해준다..
- 더해준 값을 뺄셈한다.
코드
입, 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Bjo1541 {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
String equation = bufferedReader.readLine();
Bjo1541 bjo1541 = new Bjo1541();
int result = bjo1541.solution(equation);
bufferedReader.close();
bufferedWriter.write(result + "\n");
bufferedWriter.flush();
bufferedWriter.close();
}
}
로직
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Bjo1541 {
public int solution(String equation) {
int answer;
// 문자열을 밸셈 연산자를 기준으로 분리
String[] token = equation.split("-");
int[] sums = new int[token.length];
for (int i = 0; i < token.length; i++) {
int sum = 0;
// 분리된 문자열에 있는 수를 전부 덧셈
for (int j = 0; j < token[i].split("\\+").length; j++) {
sum += Integer.parseInt(token[i].split("\\+")[j]);
}
sums[i] = sum;
}
// 첫번째 값이 음수가 되는 문제를 막기위해 첫번째 index 값을 answer로 설정
answer = sums[0];
// 덧셈한 값을 뺄셈
for (int i = 1; i < sums.length; i++) {
answer -= sums[i];
}
return answer;
}
}
+
연산자로 문자열을 분리할때 그냥"+"
하면regex.PatternSyntaxException
이 발생한다.+
문자를 이스케이프 처리해줘야 의도한 대로 문자열을 분리 할 수 있다.answer = sums[0]
에서answer
를sums
의0번째 index
에 있는 값으로 두지 않고, for 반복문에서sums
0번째 index
부터 모든 값을 뺄셈하는 경우 첫 번째가 음수가 되어 정상적으로 문제 해결이 되지 않는다. 이 문제에서 이 부분이 가능 큰 함정이라 생각했다.- 문제에서 가장 처음과 마지막 문자는 숫자이다. == 첫번째 수는 무조건 양수이다.
예제 테스트
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Bjo1541Test {
static Stream<Arguments> example() {
return Stream.of(
Arguments.of("55-50+40", -35),
Arguments.of("10+20+30+40", 100),
Arguments.of("00009-00009", 0)
);
}
@MethodSource("example")
@ParameterizedTest(name = "[{index}] expected: {0} => actual: {1}")
void test(String input, int expected) {
Bjo1541 bjo1541 = new Bjo1541();
int actual = bjo1541.solution(input);
assertThat(actual).isEqualTo(expected);
}
}
assertj
를 사용한 테스트 코드를 통해 주어진 예제에 대해 정상적으로 풀이가 되고 있는지 확인예제가 여러개 있는 경우
ParameterizedTest
를 사용하면 편리하다.
REFERENCE
#백준_1541 #백준_잃어버린_괄호
This post is licensed under CC BY 4.0 by the author.