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 | 31 |
Tags
- 유레카
- 서비스 디스커버리
- 백트래킹
- docker-compose
- BFS
- 달팽이
- 도커
- 이분 매칭
- 게이트웨이
- Gradle
- Logback
- 다익스트라
- dp
- 트리
- spring cloud
- Spring Cloud Config
- 메모이제이션
- Zuul
- 플로이드 와샬
- 스프링 시큐리티
- 구현
- spring boot
- 주울
- 구간 트리
- 비트마스킹
- Java
- ZuulFilter
- 스택
- 완전 탐색
- 이분 탐색
Archives
- Today
- Total
Hello, Freakin world!
[백준 1541번] 잃어버린 괄호 - 쉽고 간단한 풀이 본문
이 문제는 어려운 문제는 아니지만 재밌는 요소가 있습니다.
가장 맨 위 A-B+C+D-E 의 예를 보시면 - 부호 다음으로 괄호를 열고 - 부호 이전까지 괄호를 닫는 식으로 마이너스 항들을 괄호로 확장해가면서 식의 결과값을 최소화 할 수 있습니다.
이를 바로 구현하기 전에 그 바로 아래를 살펴보시죵 ㅎㅎㅎ
만약 a번째 항 바로 앞에서 마이너스 부호가 최초로 나타났다고 가정합니다. (그전까지는 숫자항들을 모두 더했겠죠?)
그리고 n번째 항 앞의 부호가 마이너스 일때와 플러스 일때 둘 다를 살펴보면 재밌는 사실을 발견할 수 있습니다.
플러스 일땐 마이너스 괄호를 확장합니다. 결국 totalSum 이라는 변수가 총합을 나타낸다면 totalSum에서 빼주게 됩니다.
마이너스 일때는 그 앞의 괄호를 닫습니다. 그리고 마지막 항이 아니라면 새로운 마이너스 괄호를 열게 됩니다. 결국! totalSum에서 빼주는 같은 결과를 나타냅니다.
이 사실이 말해주는 결론은 무엇일까요?
그 것 은 마이너스가 최초로 나타나는 시점 이후의 항들은 전부 빼주면 답이 된다는 사실!
재밌지 않나요? ㅋㅋㅋ
아래는 코드입니다
..
/*
백준 1541번 - 잃어버린 괄호
*/
public class Main {
public static void main(String[] args) throws IOException {
// InputReader reader = new InputReader("testcase.txt");
InputReader reader = new InputReader("testcase.txt");
String input = reader.readLine();
List<String> terms = split(input);
int min = solve(terms);
System.out.println(min);
}
private static List<String> split(String input) {
Pattern pattern = Pattern.compile("[0-9]+|[\\-\\+]");
Matcher matcher = pattern.matcher(input);
List<String> terms = new ArrayList<>();
while(matcher.find()) {
terms.add(matcher.group());
}
return terms;
}
private static int solve(List<String> terms) {
int totalSum = Integer.parseInt(terms.get(0));
boolean minusFlag = false;
for (int i = 1; i < terms.size(); i++) {
String term = terms.get(i);
//연산자인 경우
if(isOperator(term) ) {
if(term.equals("-")) minusFlag = true;
continue;
}
//숫자인 경우
int termVal = Integer.parseInt(term);
if(minusFlag) {
totalSum -= termVal;
}else {
totalSum += termVal;
}
}
return totalSum;
}
public static boolean isOperator(String term) {
if(term.equals("+") || term.equals("-")) return true;
return false;
}
}
class InputReader {
private BufferedReader br;
public InputReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public InputReader(String filepath) {
try {
br = new BufferedReader(new FileReader(filepath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public String readLine() throws IOException {
return br.readLine();
}
public int readInt() throws IOException {
return Integer.parseInt(readLine());
}
}
.
'알고리즘 > PS' 카테고리의 다른 글
[백준 15686번] 치킨 배달 (0) | 2020.09.14 |
---|---|
[백준 14502번] 연구소 (0) | 2020.09.13 |
[백준 14500번] 테트로미노 (0) | 2020.09.12 |
[백준 1931번] - 회의실 배정 [그리디 알고리즘의 증명] (3) | 2020.09.12 |
[백준 14503번] 로봇 청소기 (0) | 2020.09.10 |
Comments