[Leetcode] 20. Valid Parentheses (C)
์ด๋ฒ์ ํผ ๋ฌธ์ ๋ 20. Valid Parentheses ์๋ค.
๊ฐ๋จํ๊ฒ ๋ฌธ์ ๋ฅผ ์์ฝํ๋ฉด () , [], {} ์ด๋ ๊ฒ ๋ค์ํ ๊ดํธ๋ฌธ์๋ก ์ด๋ฃจ์ด์ง char array๊ฐ input์ผ๋ก ๋ค์ด์ฌ๋ ์ด ๊ดํธ๊ฐ ์ ํจํ๊ฒ ๋ฐฐ์น๋์ด์๋์ง ํ์ธํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ์ด๋ค.
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
- Every close bracket has a corresponding open bracket of the same type.
์ ํจ์ฑ์ ๋ํ ์กฐ๊ฑด์ ์ ์ธ๊ฐ์ง์ธ๋ฐ, ์๋ฅผ ๋ค๋ฉด โ()โ ์ด๊ฑด ์ ํจํ์ง๋ง โ(]โ, โ(โ, โ)โ ์ด๊ฒ๋ค์ ์ ํจํ์ง ์๋ค๋ ์๋ฏธ์ด๋ค.
์๋ง ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์ด ์ฌ๋์ด๋ผ๋ฉด ๊ต์ฅํ ์น์ํ ๋ฌธ์ ์ผ๊ฒ์ด๋ค.
๋๋ ๋ณด์๋ง์ โ์ ์คํ๋ฌธ์ ๊ตฐโ ํ๋ค.
์ฒซ๋ฒ์งธ ์๋ : Stack
์ ์๋๋ก ์คํ์ ๊ตฌํํด์ ํ์๋ค.
์ค๊ฐ์ ๋ฌธ์ ๋ฅผ ์ข ์คํดํด์ ์ด์ํ๊ฒ ํ๊ธฐ๋ ํ์ง๋ง ํ์ฌ๊ฐ ํฌ๊ฒ ์ด๋ ต์ง ์์ ์คํ ๊ตฌํ์ด์๋ค.
typedef struct stack{
char *arr;
int top,size;
} Stack;
void init_stack(Stack* st, int size)
{
char *new_arr = (char*)malloc(size);
st->top = -1;
st->size = size;
st->arr = new_arr;
}
char pop(Stack* st)
{
if(st->top<0)
{
return '\0';
}
char *arr = st->arr;
char res = arr[st->top--];
return res;
}
bool push(Stack* st, char value){
st->top++;
if(st->top==st->size) return false;
st->arr[st->top]= value;
return true;
}
bool find(Stack *st1, char find)
{
char* arr = st1->arr;
if(st1->top>=0)
{
return find==pop(st1);
}
return false;
}
bool isValid(char* s) {
Stack st;
init_stack(&st,strlen(s)); //sizeof vs strlen
for(int i=strlen(s)-1;i>-1;i--)
{
char c=s[i];
bool res = true;
switch(c)
{
case '(':
res=find(&st,')');
break;
case '[':
res=find(&st,']');
break;
case '{':
res=find(&st,'}');
break;
default:
res=push(&st,c);
}
if(!res) return false;
}
return st.top==-1;
}
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
์๊ฐ๋ณต์ก๋๋ O(n)์ด์๊ณ , ๊ณต๊ฐ๋ณต์ก๋๋ O(n)์ด์๋ค.
ํต๊ณ๋ฅผ ๋ณด๋ ์ข๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํด์ ๊ตฌํํ ์ ์๋๊ฒ ๊ฐ์์ ์ฝ๊ฐ ๊ฐ์ ์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์ : ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์ ๐
์ง์ง ๋ฌด์จ ํ ์๊ฐ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ค์ฌ๋ณด๋ ค๊ณ ๋ณ๊ฑธ ๋คํ๋๋ฐ ๊ทธ๋ฅ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํด์ ํ๋๊ฑธ ์์๋ค..ใ ใ ใ
์ฌ์ค ์ฝํ๋ฆฐ์ด๋ ํ์ด์ฌ๊ฐ์ high-level์ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์ด๋ฐ ๋ถ๋ถ์ ์ ๊ฒฝ์ฐ์ง ์์์ ๊ฐ๊ณผํ๋ ๊ฒฝํฅ์ด ์๊ธด๊ฒ๊ฐ๋ค.
์ค๋ ์๊ฐ์ ์ข ์ผ์ง๋ง ๋๋ถ์ ๋ค์์๋ ์์์ด๋ฒ๋ฆด๊ฒ ๊ฐ๋ค.
#include <stdarg.h>
typedef struct stack{
char *arr;
int top,size;
} Stack;
void init_stack(Stack* st, int size)
{
char *new_arr = (char*)malloc(size);
st->top = -1;
st->size = size;
st->arr = new_arr;
}
char pop(Stack* st)
{
if(st->top<0)
{
return '\0';
}
char *arr = st->arr;
char res = arr[st->top--];
return res;
}
bool push(Stack* st, char value){
if(st->top + 1==st->size) return false;
st->arr[st->top++]= value;
return true;
}
bool find(Stack *st1, char find)
{
char* arr = st1->arr;
if(st1->top>=0)
{
return find==pop(st1);
}
return false;
}
bool isValid(char* s) {
Stack st;
init_stack(&st,strlen(s)); //sizeof vs strlen
for(int i=strlen(s)-1;i>-1;i--)
{
char c=s[i];
bool res = true;
switch(c)
{
case '(':
res=find(&st,')');
break;
case '[':
res=find(&st,']');
break;
case '{':
res=find(&st,'}');
break;
default:
res=push(&st,c);
}
if(!res) return false;
}
free(st.arr); // โผ๏ธโผ๏ธโผ๏ธ
return st.top==-1;
}
์ค๋๋ง์ C๋ฅผ ๋ค์ ๋ณด๋ฉด์ ๋๋ผ๋๊ฑด๋ฐ ์ ๋ง ์ฌ๋ฐ๋ ์ธ์ด์ธ๊ฒ ๊ฐ๋ค.
๋ชปํ๋๊ฒ๋ ๋ง๊ณ ๋ถํธํ ๋ถ๋ถ์ด ๋ง์ง๋ง ๊ทธ ๋ถ๋ถ์ด ์์ธ๋ก ์ฌ๋ฐ์ด์ง๋ ๋ถ๋ถ์ธ๊ฒ ๊ฐ์์ ์์ฆ ์ฆ๊ฒ๊ฒ ๊ณต๋ถํ๋ ์ค์ด๋ค.
์ฌ๋ฌ๋ชจ๋ก ๋ฐ๋น ์ ๊ณต๋ถํ๊ธฐ ํ๋ค๊ธด ํ์ง๋ง ๊ทธ๋๋ ๊ณ์ ์ ํด๋ด์ผ๊ฒ ๋ค๐
๋๊ธ๋จ๊ธฐ๊ธฐ