230425_Algorithm

majungha·2023년 4월 25일
1

알고리즘

목록 보기
34/71

오늘의 알고리즘 👍

📝 1. 올바른 괄호


  • 괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다.
  • 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
  • '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

▷ 입출력 예

solution("()()") // true
solution("(())()") // true
solution(")()(") // false
solution("(()(") // false

▷ 내 풀이

function solution(s) {
  let count = 0;
  for (let i = 0; i < s.length; i++) {
    count += s[i] === '(' ? 1 : -1;
    if (s[0] === ')' || count < 0) {
      return false;
    }
  }
  return count === 0 ? true : false;
}
  • for문 안에 replace 매서드를 사용해서 풀어보려고 했는데, 생각대로 안돼서 count를 활용해서 풀이하였다.

▷ 수업 풀이

function solution(s) {
  const leng = s.length / 2;
  for (let i = 0; i < leng; i++) {
    s = s.replace('()', '');
  }
  return s === '';
}
  • 위의 풀이는 효율성 테스트에서 실패하였다.
function solution(s) {
  // 첫 시작이 닫힌 괄호로 시작하는 경우
  // 마지막이 열린 괄호로 끝나는 경우 = 올바른 괄호가 아니다.
  if (s[0] === ')' || s[s.length - 1] === '(') {
    return false;
  }

  let depth = 0; // 괄호의 길이를 체크하는 변수
  for (let i = 0; i < s.length; i++) {
    // 열린 괄호라면 1을 더해주고, 닫힌 괄호라면 1을 빼준다.
    depth += s[i] === '(' ? 1 : -1;

    // depth가 0미만일 때 = 닫힌 괄호가 더 많을 때
    if (depth < 0) {
      return false;
    }
  }
  return !depth;
}
  • 그래서 다른 방법으로 풀이를 진행하였다.

▷ split, reduce 매서드 사용 풀이

function solution(s) {
  // 첫 시작이 닫힌 괄호로 시작하는 경우
  // 마지막이 열린 괄호로 끝나는 경우 = 올바른 괄호가 아니다.
  if (s[0] === ')' || s[s.length - 1] === '(') {
    return false;
  }

  // 0 미만으로 내려가는 시점을 체크 (fail이 true가 되면 올바른 괄호가 아니다.)
  let fail = false;
  return (
    s.split('').reduce((acc, cur) => {
      // 닫힌 괄호가 먼저 들어오거나 더 많은 경우
      if (acc < 0) {
        fail = true;
      }
      return acc + (cur === '(' ? 1 : -1);
    }, 0) === 0 && !fail
  );
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글