본문 바로가기
programming/알고리즘 풀이

[SWEA] 1218. 괄호 짝짓기

by 몽구스_ 2021. 8. 5.
728x90

 

[SWEA] 1218. 괄호 짝짓기

 

 

 

예를 들어 아래와 같은 문자열은 유효하다고 판단할 수 있다.



아래와 같은 문자열은 유효하지 않은 문자열이다. 붉은색으로 표시된 괄호의 짝을 찾을 수 없기 때문이다.

 

 

[입력]

각 테스트 케이스의 첫 번째 줄에는 테스트케이스의 길이가 주어지며, 바로 다음 줄에 테스트 케이스가 주어진다.

총 10개의 테스트케이스가 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 유효성 여부를 1 또는 0으로 표시한다 (1 - 유효함, 0 - 유효하지 않음).

 

 

[풀이]

 

이 문제는 스택을 이용해야한다.

Java util의 스택을 이용해주었다.

열린괄호는 무조건 넣고 닫힌 괄호 발견시 스택의 맨위 괄호가 어떤건지 검사한 후 짝이 맞으면 스택에서 빼낸다. 

짝이 안 맞는 닫힌 괄호는 스택에 넣는다.

작업이 끝나고 스택이 모두 비면 짝이 맞아서 다 빼냈다는 말이니 유효성을 1로 한다.

 

 

 

public class al218 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		Stack<Character> s = new Stack<>(); //괄호 넣을 스택 생성
		HashMap<Character,Character> map = new HashMap<>(); 
        //같은 괄호 짝지어서 HashMap에 key,value로 저장
		map.put(')', '(');
		map.put(']', '[');
		map.put('}', '{');
		map.put('>', '<');
		
		StringBuffer sb = new StringBuffer();
		
		for(int test_case = 1; test_case <= 10; test_case++)
		{
		
			int n = sc.nextInt();
			char[] data = sc.next().toCharArray();
			int result = 0;
			
			for (int i = 0; i < n; i++) {
				char t = data[i];
				if(t == ')' || t == ']' || t == '}' || t == '>') { //닫힌 괄호 발견시 제일 위 괄호 검사
					if(s.peek() == map.get(t)) { //닫힌 괄호의 열린 괄호 짝과 같으면 스택에서 빼내기
						s.pop();
					}else {
						s.push(data[i]); //아닐 시에는 짝없는 닫힌 괄호 저장
					}
				}
				else{
					s.push(data[i]); //열린 괄호는 무조건 저장
				}
			}
			if(s.isEmpty()) { //스택이 비어있으면 짝맞는 괄호가 전부 나간 것
				result = 1;
			}
			sb.append("#" + test_case + " " + result + "\n");
			s.clear();
		}
		
		System.out.println(sb.toString());
	}

}

 

  • 20,432 kb메모리
  • 144 ms실행시간
  • 1,037코드길이
  • Pass결과

 

'programming > 알고리즘 풀이' 카테고리의 다른 글

[SWEA] 3499. 퍼펙트 셔플  (0) 2021.08.06
[SWEA] 1873. 상호의 배틀필드  (0) 2021.08.05
[SWEA] 2001. 파리 퇴치  (0) 2021.08.05
[SWEA] 2805. 농작물 수확하기  (0) 2021.08.04
[leetcode] 283. Move Zeroes  (0) 2021.06.29

댓글