일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 릴리즈 키해시
- SDUI
- flowon
- 백준
- coroutine
- TOSS 과제
- Product Flavor
- ShapeableImageView
- monotone stack
- app-distribution
- Kotlin
- coroutinescope
- ServerDrivenUI
- withContext
- java
- hotStream
- Android
- 안드로이드
- coldStream
- KAKAO
- coroutinecontext
- conflate
- google play console
- 백준2309
- cancellationException
- Advanced LCA
- Algorithm
- Flow
- Next Challenge
- collectLatest
- Today
- Total
루피도 코딩한다
[백준 9012번: 괄호](Java) 본문
알고리즘 분류 : Stack (Stack으로도 풀 수 있으나, 해당 게시물에서는 Stack의 속성만을 이용)
Stack으로도 풀 수 있는 문제이지만, 올바른 괄호 표현식의 원리를 이용해서 정수 Int type 변수 하나만을 사용했다.
[풀이 로직]
1. N을 읽는다
2. N번 String을 받아온다. // "(()))())("
3. 각 케이스마다 새롭게 사용할 index와 input을 초기화 해준다.
* index의 경우, stack의 top을 가리키는 변수와 동일하게 -1로 설정 해 주었다.
3. 2번에서 받아온 길이만큼 반복문을 돌리며 괄호 하나 하나를 검사한다
4. 정상적인 괄호식의 경우 '('부터 시작하므로, '(' 가 들어오면 index 변수에 +1을 해준다 // stack 에서의 push에 해당
5. ')'가 들어왔다는 것은 무조건 짝 지을 '('가 있어야 한다.
5-1 index == -1 이면 짝 지을 '('가 없다는 뜻이므로 NO를 출력한다
5-2 짝 지을 '('가 있다면 index -= 1 // stack에서의 pop에 해당
6. 모든 괄호 검사를 끝낸 이후에, index가 최초상태인 -1이 아니라면 '(' 만 남아있다는 뜻이므로 NO 를 출력하고, 그렇지 않다면 YES를 출력한다
NOTE 1. 이중 반복문을 사용하며, inner loop 에서 바로 outer loop의 break 혹은 coninue를 호출하고 싶을 경우 아래와 같이 사용가능하다. (번외) 내가 애정하는 kotlin에서는 outerLoop@ 로 해당 기능을 지원한다
outerLoop :
for (int i = 0 ; i< N; i++){
for (int j = 1; j< N; j++){
continue outerLoop;
}
// continue outerLoop; 가 실행되면 이부분의 코드는 실행되지 않음
}
NOTE 2. BufferedWriter를 사용할 때는 flush()를 호출해주어야 버퍼에 있는 값이 출력된다.
[정답 코드]
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
String input;
char ps;
int index;
outerLoop:
for (int i = 0; i < N; i++) {
index = -1;
input = br.readLine();
for (int j = 0; j < input.length(); j++) {
ps = input.charAt(j);
if (ps == '(') index += 1;
else {
if (index == -1) {
bw.write("NO\n");
bw.flush();
continue outerLoop;
} else index -= 1;
}
}
if (index != -1) bw.write("NO\n");
else bw.write("YES\n");
bw.flush();
}
}
}
https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
'Algorithm' 카테고리의 다른 글
[백준 11726: 2XN 타일링] kotlin 풀이 (피보나치, 팩토리얼) (1) | 2024.02.15 |
---|---|
[Graph] Advanced LCA Algorithm (0) | 2023.02.04 |
[백준 6198번: 옥상 정원 꾸미기](Java) (6) | 2022.05.18 |
[백준 2309번: 일곱 난쟁이][Java] (0) | 2022.05.11 |
[백준 2798번: 블랙잭](Java) (0) | 2022.05.09 |