Develope/알고리즘

[백준-9012] 괄호

고로이 2017. 11. 29. 13:49
반응형

[백준-9012] 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 



시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초128 MB163006289483238.886%




코드작성은 30분정도, 기타 수정까지 2시간 정도 걸린듯하다.


난이도는 하.



JAVA 1 - Stack 사용. 정석


public class Main {
public static void main(String[] args) {
java.util.Scanner scan = new java.util.Scanner(System.in);
String num = scan.nextLine();
while(scan.hasNext()){
String line = scan.nextLine();
ArrayStack stack = new ArrayStack(line.length());
System.out.println(stack.checkVPS(line));
}


}

public static class ArrayStack {
private int top;
private int maxSize;
private String[] array;

public ArrayStack(int maxSize) {
this.top = -1;
this.maxSize = maxSize;
this.array = new String[maxSize];
}

// empty check
private boolean empty(){
return (top == -1);
}

// full check
private boolean full(){
return (top == maxSize-1);
}

// push
public void push(String item){
if(full()) System.out.println("Stack Full :"+(top+1)+">=" + maxSize);
array[++top] = item;
}


// pop
public String pop()throws Exception{
if(empty()) throw new Exception("Stack Empty : top = "+top);
String item = array[top];
top--;

return item;
}

public String checkVPS(String line){
for (int i = 0; i < line.length(); i++) {
try {
String s = String.valueOf(line.charAt(i));
if ("(".equals(s)) {
push(s);
} else if (")".equals(s)) {
pop();
}
}catch (Exception e){
return "NO";
}
}

if(top == -1){
return "YES";
}else{
return "NO";
}
}
}
}



결과


메모리 : 9500 KB / 시간 : 112 ms



흠 좀더 줄여봐야지




java 2 >> stack 안쓰고 함수로 뺌


public class Main {
public static void main(String[] args) {
int i=0;
java.util.Scanner scan = new java.util.Scanner(System.in);
String num = scan.nextLine();
while(scan.hasNext()){
String line = scan.nextLine();
System.out.println(checkVPS(line));
}


}
public static String checkVPS(String line){
int num=0;
for (int i = 0; i < line.length(); i++) {
String s = String.valueOf(line.charAt(i));
if ("(".equals(s)) {
num++;
} else if (")".equals(s)) {
num--;
if(num <0 )
return "NO";
}
}
if(num == 0){
return "YES";
}else{
return "NO";
}
}
}

결과


메모리 : 9508 KB / 시간 : 112 ms


흠...70초대는 어케 만든거지...



java 2 >> hasNext 안쓰고 제시된 개수 사용


java.util.Scanner scan = new java.util.Scanner(System.in);
int num = Integer.parseInt(scan.nextLine());
for (int i = 0; i < num; i++) {
String line = scan.nextLine();
System.out.println(checkVPS(line));
}


메모리 : 9504 KB / 시간 : 108 ms



쪼오금 줄긴 줄엇다


java 3 >> BufferedReader 사용

try {
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
for (int i = 0; i < num; i++) {
String line = br.readLine();
System.out.println(checkVPS(line));
}
}catch (Exception e){
e.printStackTrace();
}



메모리 : 9136 KB / 시간 : 76 ms


시간이 반으로 줄엇다




java 3 >> StringBuilder 사용

StringBuilder sb = new StringBuilder();
try {
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
for (int i = 0; i < num; i++) {
String line = br.readLine();
sb.append(checkVPS(line));
}
}catch (Exception e){
e.printStackTrace();
}



메모리 : 9296 KB / 시간 : 72 ms



?? 메모리 늘어남 






아 백준 채점 너무 느리다..


java 4 >> 추가 수정


public class Main {

    public static void main(String[] args) throws java.io.IOException {

        StringBuilder sb = new StringBuilder();

        java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));            

        int count = Integer.parseInt(br.readLine());

        for (;count>0;count--) {

            String line = br.readLine();

            int num=0;

            for (int i = 0; i < line.length(); i++) {

                String s = String.valueOf(line.charAt(i));

                if ("(".equals(s)) {

                    num++;

                } else {

                    num--;

                    if(num <0 ){

                        sb.append("NO\n"); break;

                    }

                    

                }

            }


            if(num == 0){

                    sb.append("YES\n");

            }else if (num > 0){        

                    sb.append("NO\n");

            }

            

        }

        

        System.out.println(sb.toString());

    }


}



메모리 : 9136 KB / 시간 : 72 ms



흠 여기까지인거로...ㅠ


반응형

'Develope > 알고리즘' 카테고리의 다른 글

[알고스팟] XHAENEUNG  (5) 2017.12.11
[알고스팟] DIAMONDPATH  (2) 2017.12.11
[알고스팟] Quantization  (0) 2017.12.04
[알고스팟, 백준 9663] N-Queen  (0) 2017.12.04
[백준-10825] 국영수  (2) 2017.11.29