괄호만으로 이루어진 문자열에서 위 예시의
false
경우처럼 문법에 맞지 않는 경우false
를return
해주고, 문법에 맞을 경우true
를return
해주는 문제이다.false
가 나오는 경우의 패턴에 대해 곰곰히 생각해보았을 때, 모든 경우에서 여는 괄호 다음 닫는 괄호가 나올 경우 짝이 맞지 않는 경우가 포함된다는 것이었다. (예시) '(}', '{)' 등등). 패턴을 찾았기에 해당 조건에 따라 문제를 풀 수 있었다.
function isValid(s) {
// 여기에 코드를 입력해주세요.
// 각 괄호의 빈도수
let sDic={
"(":0,
")":0,
"{":0,
"}":0,
"[":0,
"]":0
}
let rightCase =[')',']','}'] // 닫는 괄호
let allCase = ['(','[','{',')',']','}'] // 모든 괄호 (index가 3미만이면 여는 괄호, 3 이상이면 닫는 괄호이다.)
// 객체에 해당 괄호의 나온 횟수 할당
for (let index in s){ sDic[s[index]]+=1 }
// 열고 닫는 괄호의 수가 서로 일치할 경우
if ((sDic['(']===sDic[')'])
&&(sDic['[']===sDic[']'])
&&(sDic['{']===sDic['}']))
{
for(let i=0; i<s.length; i++) // s의 모든 글자에 대하여,
{
for (let j=0; j<3; j++) // allCase에서 여는 괄호에 해당하는 index
{
// s[i]가 여는 괄호이면서, 다음 글자가 닫는 괄호이고, 짝이 이루지 않을 경우
if((allCase[j]===s[i])&&rightCase.includes(s[i+1])
&&(s[i+1]!==allCase[j+3]))
{ return false; }
}
}
return true; // 위의 경우가 하나도 없었을 경우, treu return
}
else return false; // 첫번째 조건문의 경우가 틀릴 경우(각 괄호의 짝이 맞지 않는 경우)
}
느낀 점
저번 문제를 풀때, 문제에서 요구하는 점이 무엇인지를 정확히 파악하는 것이 가장 빠른 길을 안내한다고 느꼈다. 그렇기에 문제를 5분 정도 들여다 보았고,
false
가 아닐 경우 모두true
를 return할테니false
인 경우에 패턴을 찾는것에 집중하였다. 알고리즘 문제를 푸는 다양한 방식이 있겠지만, 우선 내 접근법을 강화시켜야 다른 코딩 방법들을 익히더라도 더 숙련도 있게 알고리즘 실력을 늘릴 수 있겠다고 생각이 들었기 때문이다.
물론 다른 좋은 코드들도 보면서 다양하고 훨씬 더 좋은 방법들을 익히는 것도 매우 중요하다고 생각하고, 더 열심히 공부해야겠다.