Frontend/Algorithm
[프로그래머스] 올바른 괄호 Javascript
돌잡이개발자
2022. 3. 17. 21:59
문제설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s | answer |
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
✏️ 첫 풀이 방식
function solution(s){
var answer = true;
let braces = s.split(",");
let sum = 0;
braces.forEach((brace) => {
if(brace[0] === ")"){
answer = false;
} else {
for(let i=0; i < brace.length; i++) {
if(brace[i] === "("){
sum++;
} else {
sum--;
if(sum <0){
answer = false;
}
}
}
if(sum !== 0) {
answer = false;
}
}
})
return answer;
}
처음 내가 작성한 풀이는 주어진 s를 배열로 만들어 forEach로 순회하여 sum을 구해 sum의 합이 0보다 작을 때 또는 최종 sum이 0이 아닐 때 answer를 false로 반환하도록 했다. 어딘가 간결하지 못하고 중첩문으로 보기 어려운 코드가 되었다.
🔍 개선된 풀이 방식
function solution(s){
let count = 0;
for(const brace of s) {
if(brace === "("){
count++;
} else {
if(count === 0) {
return false;
}
count--;
}
}
return count === 0;
}
일단 변수명도 sum보다 count가 더 직관적이라는 생각이 들어 수정했다. for... of 문법을 이용해 s를 배열로 변경하는 작업을 하지 않고도더 효율적으로 s를 순회할 수 있었다.
처음부터 좋은 코드를 짜긴 어렵지만 이렇게 계속 좋은 코드를 보면서 개선해나가면 언젠가 나도 이렇게 짤 수 있지 않을까🤔
어떤 알고리즘 방식을 어떻게 효율적으로 사용할 수 있을지 많이 고민해보자!
반응형