[Leetcode] 20. Vaild Parentheses

Algorithm|2021. 7. 20. 22:07
반응형

Identifying the Problem

주어진 괄호 문자열이 올바르게 열고 닫혀야된다.

[ ) 같은 경우나, [ ( ] ) 경우는 false 값을 return 해야 한다.

Organizing thoughts

괄호가 양파를 속에서 까는 것 처럼 구상했다.

이를 위해 STACK 자료구조를 사용했다.

가장 깊은 괄호를 제거하다 보면 true 인지 false 인지 구분이 되기 때문이다.

예를 들자면, < ( [ ] ) > 에서 가장 깊은 괄호는 [] 이고

1 step 에서 []를 제거하면 <()>

2 step 에서 ()를 제거하면 <>

3 step 에서 <>을 제거하면 아무것도 남지 않는다.

 

1. 애초에 true가 되지 않는 경우

1-1 괄호가 아예 없거나

1-2 문자열의 길이가 홀수인 경우이다.

 

2. 나머지의 경우는 짝수의 경우이다.

2-1 stack에 문자열을 하나씩 집어넣다가

2-2 짝이 맞는 괄호가 있으면 마지막괄호와 들어온 괄호를 제거하고

2-2-1 아스키코드를 활용해서 두 괄호 값의 차가 일정값이면 짝이 맞는 것이다.

2-3 index를 마지막 괄호 이전으로 놓는다.

3. stack에 뭐가 남아있으면 fasle, 다 지워졌으면 true 를 return 한다.

Sourcecode

bool isValid(char * s)
{
	int n = strlen(s); 
	int t = 1; //스택의 index
	char stack[10000] ={0,}; //스택
	int gap=0;

	if(n==0) return true; //1-1
	else if(n%2 ==1) return false; //1-2
	
   	 else //2
             {
  	 	for(int i=0; i<n; i++)
        		{
   			stack[t] = *(s+i); //2-1
    			gap = stack[t] - stack[t-1];
    		
			if( 0<gap && gap<3   &&i>0) //[]같은 경우 gap 값이 2가 된다.
   	 		{
    				stack[t]=0; //2-2
   	  			stack[t-1]=0;
     				t= t-2; //2-3
  			}
            
  			t++;
 	 	}
	}
    
    
    if(stack[1] == 0) return true;
    else return false;
}

Mistake

모든 경우의 수를 생각하며 패턴을 찾는 데에 집중했다.

바로 옆과 끝의 관계에 따라 코드를 짜봤는데 너무 복잡하고, test case 에서 걸러지는 경우 더 코드가 복잡해졌다.

어떻게든 혼자서 풀려고 노력했는데 도저히 생각이 안나 solution을 참고했고, 의외로 단순한 문제였다.

도저히 안풀리는 것은 solution과 다른 사람의 코드를 보고 빨리 진행하는 것이 좋을 듯 하다.

 

New things learned

  • Stack 자료구조 Last In First Out 구조로 프링글스 통안에 자료를 집어넣고 뺀다고 생각하면 된다.

 

 

반응형

'Algorithm' 카테고리의 다른 글

[Leetcode] 14. Longest Common Prefix  (0) 2021.07.24
[Leetcode] 13. Roman to Integer  (0) 2021.07.20
[Leetcode] 9. Palindrome Number  (0) 2021.07.19
[Leetcode] 7. Reverse Integer  (0) 2021.07.18
[Leetcode] 1. Two Sum  (0) 2021.07.18

댓글()