백준 괄호 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