문제 설명

괄호가 바르게 짝지어졌다는 것은 '('문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer
"()()"true
"(())()"true
")()("false
"(()("false

입출력 예 설명

입출력 예 #1,2,3,4

문제의 예시와 같습니다.


✍ SOLUTION1

const solution = s => {
    let result = 0;
    const sArr = s.split("");
    
    sArr.map(x => {
        if(result < 0) return;
        return x === "(" ? result += 1 : result -= 1;
    })
    
    return result ? false : true
}

/*
내가 처음 작성한 코드이다.

1. result 변수는 짝이 맞는 괄호를 확인하기 위한 카운터로 사용되는 변수이다. 0 으로 초기화한다.
2. s.split("")을 통해 입력된 문자열 s를 문자 단위로 분리하여 배열 sArr에 저장한다.
3. map을 통해서 배열 sArr의 각 원소를 순회하며 괄호의 짝을 확인한다.
4. 만약 result 값이 음수가 되면 함수는 더 이상 계산을 진행하지 않는다. 
이는 닫는 괄호가 여는 괄호보다 많아 괄호의 짝이 맞지 않음을 의미한다.
5. 현재 원소가 여는 괄호 (인 경우 result를 1 증가시키고, 닫는 괄호 )인 경우 result를 1 감소시킨다.
6. 만약 result가 0이 아니라면 (즉, 괄호의 짝이 완벽하게 맞지 않으면), false를 반환하고
result가 0이라면 (모든 괄호의 짝이 맞다면), true를 반환한다.
*/

✍ SOLUTION2

const solution = s => { 
    let result = 0;

    for (let i=0; i<s.length; i++) {
        s[i] === "(" ? result += 1 : result -= 1 
        if (result < 0) {
            break;
        }
    }
    return result ? false : true;
}

/*
명령형으로 작성해보았다.

1. result 변수는 짝이 맞는 괄호를 확인하기 위한 카운터로 사용되는 변수이다. 0 으로 초기화한다.
2. for문을 통해 문자열 s의 각 문자에 대해 반복한다.
3. 현재 문자가 여는 괄호 (이면 result를 1 증가시키고, 닫는 괄호 )이면 result를 1 감소시킨다.
4. result가 음수가 되면 루프를 즉시 중단한다. 이는 닫는 괄호가 여는 괄호보다 더 많아 
괄호의 짝이 맞지 않음을 의미한다.
5. result가 0이 아니면 false를 반환하고, 0이면 true를 반환한다.
*/

출처 : 프로그래머스 스쿨 | 코딩테스트 연습

0개의 댓글