본문 바로가기
알고리즘/백준

4949번 문제 : 균형잡힌 세상

by son_i 2023. 4. 15.
728x90

4949번: 균형잡힌 세상 (acmicpc.net)

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

 

Collection 프레임워크의 List를 이용해서 스택을 구현해 풀었다 !

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성

		while(true) {
			String str = br.readLine(); //문자열을 입력받음 
			if(str.charAt(0)=='.')
				break;
			for(int i=0;i<str.length();i++) {
				if(str.charAt(i) =='[' || str.charAt(i)=='(') { //문자요소가 괄호가 아니면 stack에 넣기
					stack.add(str.charAt(i));
				}
				else if(str.charAt(i) ==']' || str.charAt(i)==')'){//요소가 닫힌 괄호이면 
					if(str.charAt(i) == ']')
						largec = false;
					else if(str.charAt(i)==')')
						smallc = false;
					//스택의 맨 위 요소를 가져와서 열린 괄호면
					if(stack.size() != 0) {
						if(stack.get(stack.size()-1) == '(' || stack.get(stack.size()-1) == '[') {
							if(stack.get(stack.size()-1) == '[') {
								largec = true;
								stack.remove(stack.size()-1);
							}
							else if(stack.get(stack.size()-1)=='(') {
								smallc = true;
								stack.remove(stack.size()-1);
							}
						}
					}
				}
			}
			if(smallc == true && largec==true)
				System.out.println("yes");
			else
				System.out.println("no");
		}
		
	}
}

엥 근데 틀렸대 ㅠ 모지

 

아 스택의 맨 위에 짝맞는 요소가 없을 수도 있는 거를 고려 안 했다 !

예를 들면 [ (  [  ) ] ] 이거는 no

수정했는데

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성

		while(true) {
			String str = br.readLine(); //문자열을 입력받음 
			if(str.charAt(0)=='.')
				break;
			for(int i=0;i<str.length();i++) {
				if(str.charAt(i) =='[' || str.charAt(i)=='(') { //문자요소가 괄호가 아니면 stack에 넣기
					stack.add(str.charAt(i));
					System.out.println(str.charAt(i));
				}
				else if(str.charAt(i) ==']' || str.charAt(i)==')'){//요소가 닫힌 괄호이면 
					System.out.println("지금문자"+str.charAt(i));
					if(str.charAt(i) == ']')
						largec = false;
					else if(str.charAt(i)==')')
						smallc = false;
					//스택의 요소를 가져와서 열린 괄호면
					if(stack.size() != 0) {
						System.out.println("스택 크기"+stack.size());
						for(int j=stack.size()-1;j>=0;j--) {
							System.out.println("스택검사"+stack.get(j));
							if(str.charAt(i) == ']') {
								if(stack.get(j)=='[') {
									largec = true;
									System.out.println("뽑히는 애"+stack.get(j));
									stack.remove(j);
									break;
								}
								else
									break;
							}
							else{ //(str.charAt(i) == ')') {
								if(stack.get(j)=='(') {
									smallc = true;
									System.out.println("뽑히는 애"+stack.get(j));
									stack.remove(j);
									break;
								}
								else // [ 일 때 
									break;
							}
						}
					}
				}
				else if(str.charAt(i)=='.') {
					stack.clear();
				}
			}
			if(smallc == true && largec==true)
				System.out.println("yes");
			else
				System.out.println("no");
		}
		
	}
}

 

또 틀렸대

반례를 찾았따 !

([)]). 답은 no인데 yes로 나옴.

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			int ch=0;
			String str = br.readLine(); //문자열을 입력받음 
			if(str.charAt(0)=='.')
				break;
			for(int i=0;i<str.length();i++) {
				if(str.charAt(i) =='[' || str.charAt(i)=='(') { //문자요소가 괄호가 아니면 stack에 넣기
					stack.add(str.charAt(i));
					System.out.println(str.charAt(i));
				}
				else if(str.charAt(i) ==']' || str.charAt(i)==')'){//요소가 닫힌 괄호이면 
					System.out.println("지금문자"+str.charAt(i));
					if(str.charAt(i) == ']')
						largec = false;
					else if(str.charAt(i)==')')
						smallc = false;
					//스택의 요소를 가져와서 열린 괄호면
					if(stack.size() != 0) {
						System.out.println("스택 크기"+stack.size());
						for(int j=stack.size()-1;j>=0;j--) {
							System.out.println("스택검사"+stack.get(j));
							if(str.charAt(i) == ']') {
								if(stack.get(j)=='[') {
									largec = true;
									System.out.println("뽑히는 애"+stack.get(j));
									stack.remove(j);
									break;
								}
								else {
									ch=1;
									break;
								}
									
							}
							else{ //(str.charAt(i) == ')') {
								if(stack.get(j)=='(') {
									smallc = true;
									System.out.println("뽑히는 애"+stack.get(j));
									stack.remove(j);
									break;
								}
								else {// [ 일 때 
									ch=1;
									break;
								}
							}
						}
					}
				}
				else if(str.charAt(i)=='.') {
					stack.clear();
				}
			}
			if(smallc == true && largec==true && ch == 0)
				System.out.println("yes");
			else
				System.out.println("no");
		}
		
	}
}

 

고쳤는데 또 틀렸어

 

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			int ch = 0;
			String str = br.readLine(); //문자열 입력
			if(str.charAt(0)=='.') break; //첫 글자 .이면 반복 종료
	
			for(int i=0;i<str.length();i++) {
				if(ch == 1)break;
				char current = str.charAt(i);
				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					stack.clear();
					break;
				}
			}
			
			if(ch==0 && smallc == true && largec == true)
				System.out.println("yes");
			else 				System.out.println("no");

		}
		
	}
}

싹 지우고 다시 한 번 풀어봤는데 또 틀렸어

아 ! (. 입력했을 때 yes로 나와 !

 

조건을 수정했다

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			int ch = 0;
			String str = br.readLine(); //문자열 입력
			if(str.charAt(0)=='.') break; //첫 글자 .이면 반복 종료
	
			for(int i=0;i<str.length();i++) {
				if(ch == 1)break;
				char current = str.charAt(i);
				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
					if(current =='(') smallc = false;
					else if(current =='[') largec = false;
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					stack.clear();
					break;
				}
			}
			
			if(ch==0 && smallc == true && largec == true)
				System.out.println("yes");
			else 				System.out.println("no");

		}
		
	}
}

아예 열린괄호를 만났을 때 smallc와 largec를 false로 바꿔버리는 걸로

아 근데 또 틀렸대 XX

 

반례를 또 찾았따

((). 바로 이거 ...!

수정하고 지금까지 반례 다 맞는데 또 틀렸대

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력
			if(str.charAt(0)=='.') break; //첫 글자 .이면 반복 종료
	
			for(int i=0;i<str.length();i++) {
				if(ch == 1)break;
				char current = str.charAt(i);
				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
					
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					if(stack.size() != 0) ch=1;
					stack.clear();
					break;
				}
			}
			if(ch==0 && smallc == true && largec == true)
				System.out.println("yes");
			else 				System.out.println("no");

		}
		
	}
}

엥 모야 갑자기 잘 되던 " ."가 안 됨 !! 뭐야 아무것도 안 했는데 또 됨 ㅋㅋ... "/."하고 " ."했더니 안 되다가 예제 순서대로 입력하니까 또 되고.. 뭐

]]. 뒤에 /.나 " ." 입력하니까 안 된다 stack에 아무것도 없을 때..음..가 아니라

]]. 하면 largec가 false가 되어있는 상탠데 그 다음에괄호가 없는 조건이 나오면 true로 바꿔줄 수 있는 조건에 걸리질 않으니까 그대로 false값을 가져서 이상한 값이 나오는 거였음 !!

 

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력
			if(str.charAt(0)=='.') break; //첫 글자 .이면 반복 종료
			for(int i=0;i<str.length();i++) {
				if(ch == 1) break;
				char current = str.charAt(i);

				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					if(stack.size() != 0) ch=1;
					stack.clear();
					break;
				}
			}
			if(ch==0 && smallc == true && largec == true)
				System.out.println("yes");
			else {
				System.out.println("no");
				largec=true;
				smallc=true;
			}

		}
		
	}
}

그거 다 수정했는데 또 틀렸대 씨

 

입출력형식 땜에 그런 줄 알고 예제랑 똑같이 한 번에 입력하고 한 번에 결과 출력하게 했는데 또 틀렸다

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력

			if(str.charAt(0)=='.') break; //첫 글자 .이면 반복 종료
			for(int i=0;i<str.length();i++) {
				if(ch == 1) break;
				char current = str.charAt(i);

				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					if(stack.size() != 0) ch=1;
					stack.clear();
					break;
				}
			}
			if(ch==0 && smallc == true && largec == true)
				sb.append("yes"+"\n");
				//System.out.println("yes");
			else {
				//System.out.println("no");
				sb.append("no"+"\n");
				largec=true;
				smallc=true;
			}

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

흐으으음..... \n때문인가 싶어서 맞췄는데 또 틀림

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력

			if(str.charAt(0)=='.') break; //첫 글자 .이면 반복 종료
			sb.append("\n");
			for(int i=0;i<str.length();i++) {
				if(ch == 1) break;
				char current = str.charAt(i);

				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					if(stack.size() != 0) ch=1;
					stack.clear();
					break;
				}
			}
			if(ch==0 && smallc == true && largec == true) {
				sb.append("yes");
			}
				//System.out.println("yes");
			else {
				//System.out.println("no");
				sb.append("no");
				largec=true;
				smallc=true;
			}

		}
		System.out.print(sb);
	}
}

헐 ..ㅋㅋㅋ 첫글자가 .이어도 뒤에 내용이 더 있으면 종료하면 안 된대 !!!!! 

 

그거 수정했는데도 계속 틀렷대

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력

			if(str.charAt(0)=='.' && str.length() ==1) break; //첫 글자 .이면 반복 종료
			//sb.append("\n");
			for(int i=0;i<str.length();i++) {
				if(ch == 1) break;
				char current = str.charAt(i);

				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					if(stack.size() != 0) ch=1;
					stack.clear();
					break;
				}
			}
			if(ch==0 && smallc == true && largec == true) {
				sb.append("yes"+"\n");
			}
				//System.out.println("yes");
			else {
				//System.out.println("no");
				sb.append("no"+"\n");
				largec=true;
				smallc=true;
			}

		}
		System.out.print(sb);
	}
}

갑자기 ( 이거 하나 넣을 때 yes나오고 지이이랄 

뭐야 또 다시하니까 안 나 아 

(

.

했을때는 문자열 끝이 .으로 끝난다메 (뒤에 . 안 붙이는 경우는 뺴야지

글 읽기 - 10페이지까지 반례 다 해봤으나 맞는데 자꾸 틀렸다고 뜹니 (acmicpc.net)

 

글 읽기 - 10페이지까지 반례 다 해봤으나 맞는데 자꾸 틀렸다고 뜹니

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

결국 질문 올림

 

하도 답답해서 답 찾아보니까 그냥 엄청 간단하게 했네 ...?

 

뭐임 개간단하게 풀었어 ㅡㅡ

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		Stack <Character>stack = new Stack<>();
		
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine();
			
			if(str.charAt(0)=='.' && str.length()==1) break;
			
			for(int i=0;i<str.length();i++) {
				if(str.charAt(i)=='(' || str.charAt(i)=='[') {
					stack.push(str.charAt(i));
				}
				else if(str.charAt(i)==')' || str.charAt(i)==']') {
					if(!stack.isEmpty()) {
						if(str.charAt(i)==')') {
							if(stack.peek() =='(') {
								stack.pop();
							}
							else {
								ch = 1;
								break;
							}
						}
						else if(str.charAt(i)==']') {
							if(stack.peek() =='[') {
								stack.pop();
							}
							else {
								ch = 1;
								break;
							}
						}
					}
					else {
						ch=1;
						break;
					}
				}
				
			}if(ch==0 && stack.isEmpty()) {
				sb.append("yes"+"\n");
			}
			else sb.append("no"+"\n");
		}
		System.out.print(sb);
	}
}

이전거랑 다른게 뭐야 !>!?!?!?!?!?!?!

 

/.
 .
]].
[[.
/.
(().
(.
).
[.
].
.().
([)]).
.
//반례모음

원래 ArryaList도 수정을 해서 맞았다.

smallc랑 largec 에서 오류가 있었나보다.....

뺐어도 전혀 문제가 없었네

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력

			if(str.charAt(0)=='.' && str.length() ==1) break; //첫 글자 .이면 반복 종료
			
			for(int i=0;i<str.length();i++) {
				char current = str.charAt(i);

				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
				
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									stack.remove(j);
									break;
								}
								else{
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									stack.remove(j);
									break;
								}
								else {
									ch = 1;
									break;
								}
							}
						}
					}
					else {
						ch=1;
						break;
					}
				}
			}
			if(ch==0 && stack.size()==0) {
				sb.append("yes"+"\n");
			}
			else {
				sb.append("no"+"\n");
			}

		}
		System.out.print(sb);
	}
}

어제 내가 4시간동안 고민한 코드 질문게시판에 답글을 반례로 달아주셔서 해봤는데 ][]. 를 하면 yes가 나왔다.

이는 )나]의 닫힌 괄호가 나왔을 때 스택이 비어있을 경우를 고려하지 않은 것 ..............

아주 간단하게 해결해버렸다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

class Main{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		boolean smallc=true;
		boolean largec=true;
		
		List <Character>stack = new ArrayList<>(); //Collection프레임워크의 List를 사용해서 stack생성
		while(true) {
			stack.clear();
			int ch = 0;
			String str = br.readLine(); //문자열 입력

			if(str.charAt(0)=='.' && str.length() ==1) break; //첫 글자 .이면 반복 종료
			//sb.append("\n");
			for(int i=0;i<str.length();i++) {
				if(ch == 1) break;
				char current = str.charAt(i);

				if(current =='(' || current=='[') { //문자가 열린 괄호이면
					stack.add(current); //스택에 입력
				}
				else if(current ==')' || current==']') { //문자가 닫힌 괄호이면
					if(current ==')') smallc = false;
					else if(current ==']') largec = false;
					if(stack.size() != 0) { //스택이 비어있지 않을 때
						for(int j=stack.size()-1;j>=0;j--) { //스택의 맨 위부터 탐색
							if(current ==']' ) {
								if(stack.get(j)=='[') {
									largec= true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j) =='(') {
									ch = 1;
									break;
								}
							}
							else if(current ==')' ) {
								if(stack.get(j)=='(') {
									smallc =true;
									stack.remove(j);
									break;
								}
								else if(stack.get(j)=='[') {
									ch = 1;
									break;
								}
							}
						}
					}
					else { //스택이 비어있으면
					ch=1;
					break;
					}
				}
				else if(current == '.') { //문자열의 끝이 .이면 스택 비우고 새로 시작
					if(stack.size() != 0) ch=1;
					stack.clear();
					break;
				}
			}
			if(ch==0 && smallc == true && largec == true && stack.size()==0) {
				sb.append("yes"+"\n");
			}
				//System.out.println("yes");
			else {
				//System.out.println("no");
				sb.append("no"+"\n");
				largec=true;
				smallc=true;
			}

		}
		System.out.print(sb);
	}
}

 

728x90

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

10811번 문제 : 바구니 뒤집기  (0) 2023.04.15
10926번 문제 : ??!  (0) 2023.04.15
2869번 문제 : 달팽이는 올라가고 싶다  (0) 2023.04.14
2805번 문제 : 나무 자르기  (0) 2023.04.11
2798번 문제 : 블랙잭  (0) 2023.04.03