일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CS
- python
- Spotify Api
- 파이썬
- SECS-II
- 프로그래머스
- Spring JPA
- 회원가입
- 회귀
- 백준
- SECS
- SECS/GEM
- SW Expert Academy
- Gem
- linux
- modern c++
- regression
- MYSQL
- Computer Science
- SWEA
- java
- programmers
- 스포티파이
- spring boot
- C++
- 자바
- Baekjoon
- spotify
- c
- Spring
- Today
- Total
비버놀로지
[BAEKJOON 백준] 5875 오타 (JAVA) 본문
https://www.acmicpc.net/problem/5875
문제
올바른 괄호쌍을 좋아하는 키파는 최근에 노트북을 샀다. 그런데 키보드의 크기가 너무 작았기 때문에, 키파는 혹시 여는 괄호와 닫는 괄호를 서로 잘못 입력하지 않았는지 걱정되었다. 키파를 도와 올바른 괄호쌍이 되도록 고쳐 주자.
키파는 괄호를 입력할 때 매우 조심했기 때문에 최대 한 번 오타를 내었다. 올바른 괄호쌍은 다음과 같이 정의된다:
- ()는 올바른 괄호쌍이다.
- A가 올바른 괄호쌍이라면 (A) 또한 올바른 괄호쌍이다.
- A와 B가 올바른 괄호쌍이라면 AB 또한 올바른 괄호쌍이다.
입력
첫째 줄에 키파가 입력한 괄호열이 주어진다. 길이는 1 이상 100,000 이하이다.
출력
첫째 줄에 하나의 문자만 고쳐서 올바른 괄호쌍이 될 수 있는 경우의 수를 출력한다.
예제 입력 1 복사
()(())))
예제 출력 1 복사
4
힌트
키파가 입력한 다음 문자열을 자세히 보자:
12345678
()(())))
2번째 문자 )를 (로 고침으로써 올바른 문자열을 만들 수 있다:
12345678
(((())))
비슷하게, 5번째 문자, 6번째 문자, 혹은 7번째 문자를 고침으로써 올바른 문자열을 만들 수 있다.
'오탈자가 1개만 존재한다!' 가 이 문제의 핵심이다.
문자열에서 오탈자가 존재할 수 밖에 없는 영역이 나오면
뒤에 있는 건 고려하지 않는다. 뒤에건 오탈자가 없어야 하므로...
이 문제 자체가 '전제조건'을 '!특히!' 고려해줘야한다!!!
우선, 여는괄호 '(' = +1, 닫는괄호 ')' = -1 로 두고, 입력된 괄호문자열을 리스트로 받는다.
그 리스트를 for문으로 차례차례 돌면서 total 값도 구해준다.
이 문제의 조건은 최대 1개의 오타가 존재하는 것이므로,
최종 total 값은 ')' 가 오탈자면 -2, '('가 오탈자면 +2 만 가능하다.
그리고, for문 돌면서 total 값이 -2 아래로 내려가면 안된다.
( ) ) ) ) ( -> total : 1, 0, -1, -2, -3, -2
( ) ) ) ) ) ( ( ( -> total : 1, 0, -1, -2, -3, -4, -3, -2, -1
( ) ) ) ) ) ) ( ( ( -> total : 1, 0, -1, -2, -3, -4, -5, -4, -3, -2
위의 예시를 보면,
total 값이 -2 미만의 값을 가질 경우, 오탈자가 2개 이상이 된다.
따라서 오탈자가 '1개만' 나오는 total의 최솟값이 -2라는 것을 알 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int len = str.length();
int left = 0;
int right = 0;
int total = 0;
int result = 0;
for (int i = 0; i < len; i++) {
char value = str.charAt(i);
if (value == '(') {
left++;
total++;
} else {
right++;
total--;
}
if (total == 1) {
left = 0;
}
if (total == -1) {
result = right;
break;
}
}
if (total == 2) {
result = left;
}
System.out.println(result);
}
}
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 2306 유전자 (JAVA) (0) | 2022.05.14 |
---|---|
[BAEKJOON 백준] 14462 소가 길을 건너간 이유 8 (JAVA) (0) | 2022.05.14 |
[BAEKJOON 백준] 13302 리조트 (JAVA) (0) | 2022.05.12 |
[BAEKJOON 백준] 16507 어두운 건 무서워 (JAVA) (0) | 2022.05.08 |
[BAEKJOON 백준] 17425 약수의 합 (JAVA) (0) | 2022.05.08 |