백준 괄호 9093 java
2022. 3. 17. 00:41ㆍ프로그래밍 대회
처음 풀때는 23분 소요(알고리즘 구상 + 에러해결)
다시 풀때는 7분 소요 (only code 작성시간)
처음 풀때 에러해결에서 시간을 좀 잡아 먹었다.
1. stack 초기화 안함
2. 29번째 줄 s.charAt(i) -> s.charAt(j) 잘못써서 고침
3. "(" 로 끝나는 줄 체크 후에 isEmpty 체크
1.항상 초기화를 잊는데, 진짜 중요하다. 이전루프의 쓰레기값이 결과를 망친다.
매 루프 돌때마다 동일한 자료구조의 객체를 쓸때면 초기화를 신경쓰자!
2. 변수 실수
-> 깔끔하게 작성하려다 함수로 급히 바꾸려다보니 i,j 가 헷갈린다.
3. 코드 작성 전에 주석으로 어떤 결과들이 예상되는지 표시하면 더 빨리 해결할 수 있었다.
이 문제의 경우 false 가 나올 경우의 수는 2가지다.
(1) "(" 가 남는 경우
(2) ")" 가 남는 경우
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Stack;
public class Main {
static Stack stack =new Stack<>();
public static void main(String[] args) throws NumberFormatException, IOException {
//입력
BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
int n =Integer.parseInt(in.readLine());
for (int i = 0; i < n; i++) {
String s =in.readLine();
if(func(s)) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
//func
}
static boolean func(String s) {
//할떄마다 리셋
stack =new Stack<>();
for (int i = 0; i < s.length(); i++) {
if ( s.charAt(i)=='(') {
//삽입
stack.add('(');
}else {
if(!stack.isEmpty()) {
stack.pop();
}else {// ) 가 남는 경우
return false;
}
}
}
// ( 가 남는 경우
if(!stack.isEmpty()) {
return false;
}
return true;
}
}
리팩토링 코드
stack 을 new매번 생성하기보다 -> clear 를 쓰는게 더 낫다.
함수 보다 -> flag 로 처리하는게 더 시간 절약되고 간단한거 같다.
80ms이 리팩토링 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws Exception, IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int T= Integer.parseInt(bf.readLine());
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < T; i++) {
char s[] =bf.readLine().toCharArray();
stack.clear();
boolean flag=true;
for (int j = 0; j < s.length; j++) {
if(s[j]=='(') stack.add(1);
else {
if(stack.isEmpty()) {
flag=false;
break;
}else stack.pop();
}
}
// stack 비어있는데 꺼내려한다. no
if(!stack.isEmpty()) {
flag=false;
}// 끝났는데 stack 이 차있다 no
if(!flag) {
System.out.println("NO");
}else {
System.out.println("YES");
}
}
}
}
'프로그래밍 대회' 카테고리의 다른 글
1757 달려달려 (java) (0) | 2020.08.05 |
---|---|
SWEA 모의역량테스트 탈주범 검거 (0) | 2020.06.02 |
백준 2636 치즈 (0) | 2020.05.15 |
2630 색종이 만들기 (0) | 2020.02.25 |
2178 미로탐색 (0) | 2020.02.25 |