๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 9012๋ฒˆ: ๊ด„ํ˜ธ(์Šคํƒ)

by ์ฃผ๋ฐœ2 2020. 4. 19.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/9012

 

9012๋ฒˆ: ๊ด„ํ˜ธ

๋ฌธ์ œ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Parenthesis String, PS)์€ ๋‘ ๊ฐœ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ์ธ ‘(’ ์™€ ‘)’ ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๊ทธ ์ค‘์—์„œ ๊ด„ํ˜ธ์˜ ๋ชจ์–‘์ด ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Valid PS, VPS)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•œ ์Œ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ๋กœ ๋œ “( )” ๋ฌธ์ž์—ด์€ ๊ธฐ๋ณธ VPS ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋งŒ์ผ x ๊ฐ€ VPS ๋ผ๋ฉด ์ด๊ฒƒ์„ ํ•˜๋‚˜์˜ ๊ด„ํ˜ธ์— ๋„ฃ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด “(x)”๋„ VPS ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ VPS x ์™€ y๋ฅผ ์ ‘ํ•ฉ(conc

www.acmicpc.net

์ฝ”๋“œ

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 IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(bf.readLine());
		
		for(int tc=0; tc<T; tc++) {
			String str = bf.readLine();
			Stack<Character> s = new Stack<Character>();
			boolean flag = true;
			
			for(int i=0; i<str.length(); i++) {
				// ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ '(' ์ธ ๊ฒฝ์šฐ ์Šคํƒ์— ์ €์žฅ
				if(str.charAt(i) == '(') 
					s.push('(');
				
				// ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ')' ์ธ ๊ฒฝ์šฐ
				else {
					if(s.isEmpty()) {	// ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ๊ฒฝ์šฐ
						flag = false;
						break;
					}
					
					else if(s.peek() == '(') // ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’์ด '(' ์ธ ๊ฒฝ์šฐ -> ์ œ๊ฑฐ
						s.pop();
					
					else if(s.peek() == ')') // ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’์ด ')' ์ธ ๊ฒฝ์šฐ -> ์ €์žฅ
						s.push(')');
				}
			}
			
			if(!flag || !s.isEmpty())
				System.out.println("NO");
			else
				System.out.println("YES");
		}
		
		bf.close();
	}

}

ํ’€์ด

๊ด„ํ˜ธ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ ์Šคํƒ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

() ์Œ์ธ๊ฒฝ์šฐ YES , ๊ทธ๋ ‡์ง€ ์•Š์€๊ฒฝ์šฐ NO๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ.

 

ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ' ( ' ์ธ ๊ฒฝ์šฐ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ 

ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ' ) ' ๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ๋งŒ ์ƒ๊ฐ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  - ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ -> ' ) ' ๋ฅผ ์ง€์šธ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋” ์ด์ƒ ๋ฐ˜๋ณต๋ฌธ์„ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์ด flag๋ฅผ false๋กœ ์„ค์ •ํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

  - ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’(peek())์ด ' ( ' ์ธ ๊ฒฝ์šฐ -> '( )' ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ์Œ์ด๋ฏ€๋กœ ์Šคํƒ์—์„œ '('์„ ์ œ๊ฑฐํ•œ๋‹ค.(pop())

  - ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’(peek())์ด ' ) ' ์ธ ๊ฒฝ์šฐ -> ' ) ' ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค.

 

 

 

๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ... ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ' ) ' ๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ์—์„œ ์ €๋ ‡๊ฒŒ ๋‚˜๋ˆ„์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๋ฌธ์ œ์—์„œ๋Š” ()(()) ์™€ ๊ฐ™์ด ' ) ' ๋ฌธ์ž๊ฐ€ ์—ฐ์†์œผ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, Stack์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด '()' ์Œ์ด ์˜ค๋ฉด ๊ด„ํ˜ธ์Œ์ด ์ œ๊ฑฐ๋˜๋ฏ€๋กœ ์—ฐ์†๋œ ' ) ' ๊ฐ€ ์˜ฌ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ' ) ' ์ธ๊ฒฝ์šฐ์— ์Šคํƒ์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜, ์ด์ „ ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’์ด ' ) ' ์ธ๊ฒฝ์šฐ ๋ชจ๋‘ NO ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

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 IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(bf.readLine());
		
		for(int tc=0; tc<T; tc++) {
			String str = bf.readLine();
			Stack<Character> s = new Stack<Character>();
			boolean flag = true;
			
			for(int i=0; i<str.length(); i++) {
				// ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ '(' ์ธ ๊ฒฝ์šฐ ์Šคํƒ์— ์ €์žฅ
				if(str.charAt(i) == '(') 
					s.push('(');
				
				// ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ')' ์ธ ๊ฒฝ์šฐ
				else {
					// ์Šคํƒ์ด ๋น„์–ด์žˆ๊ฑฐ๋‚˜ ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’์ด ')' ์ธ ๊ฒฝ์šฐ - ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž X
					if(s.isEmpty() || s.peek() == ')') {	
						flag = false;
						break;
					}
					
					else if(s.peek() == '(') // ์Šคํƒ์— ์ €์žฅ๋œ ๊ฐ’์ด '(' ์ธ ๊ฒฝ์šฐ -> ์ œ๊ฑฐ
						s.pop();
				}
			}
			
			if(!flag || !s.isEmpty())
				System.out.println("NO");
			else
				System.out.println("YES");
		}
		
		bf.close();
	}

}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€