Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- SerialDate 리펙터링
- 2206번
- 9장
- 가장 긴 증가하는 부분 수열2
- 17장
- Spring
- 10830번
- BOJ
- DxTrace
- 1300번
- 2166번
- Adapater Pattern
- 1043번
- Design Patterns
- 클린코드
- Design Pattern
- springboot
- 11286번
- Dxerr.h
- 자바의 정석
- 코딩테스트
- 2156번
- 냄새와 휴리스틱
- 11758번
- 코딩 테스트
- programmers
- java의 정석
- 백준
- java
- 프로그래머스
Archives
- Today
- Total
Don't give up!
[백준] 1541번 : 잃어버린 괄호 (java) 본문
어떻게 생각하고 문제를 풀었는가?
+와 -만으로 이루어진 식에서 최소 값은 - 연산이 나온 이후의 값을 모두 -로 만들었을 때 구할 수 있습니다.
따라서 문자열의 첫 - 연산 위치를 확인하고, 문자열을 나눈 후 각 문자열의 숫자 값을 모두 합하여 첫 문자열로부터 도출한 값 - 나중 문자열로부터 도출한 값으로 문제를 해결할 수 있을 것이라고 생각하였습니다.
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String formula = reader.readLine();
reader.close();
String[] subformulas = formula.split("-", 2);
int result = calculate(subformulas[0]);
if(minusExisted(subformulas)){
result -= calculate(subformulas[1]);
}
System.out.println(result);
}
private static int calculate(String formula){
String[] values = formula.split("\\D");
return Arrays.stream(values).mapToInt(Integer::parseInt).sum();
}
private static boolean minusExisted(String[] subformulas){
return subformulas.length > 1;
}
}
String의 split과 정규 표현식을 사용하여 코드를 작성하였습니다.
첫 - 연산을 기점으로 두 개의 문자열을 나누기 위해 split("-", 2)를 호출하여 최대 2개의 문자열로만 나뉘어 질 수 있도록 하였고, 0~9가 아닌 문자열을 의미하는 정규 표현식 \D를 split의 인자로 사용하여 연산을 무시하고 숫자 값들만을 String배열에 저장할 수 있도록 하였습니다.
문제를 해결함에 있어 주의해야할 점은 - 연산이 없는 입력이 존재할 수 있다는 것입니다.
split함수의 결과가 문자열 하나로만 이루어진 배열이므로 배열의 크기가 1보다 크다면 (크기가 2라면) 뺄셈을 해주는 것으로 정상적인 결과를 얻을 수 있습니다.
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 10830번 : 행렬 제곱 (java) (0) | 2021.08.18 |
---|---|
[백준] 11758번 : CCW (java) (0) | 2021.08.16 |
[백준] 2166번 : 다각형의 면적 (java) (0) | 2021.08.15 |