본문 바로가기
코테연습

118. 올바른 괄호 Javascript

by hxunz 2022. 9. 12.

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return
  • 주어진 자료는 무엇인가?
     - 문자열 s
  • 조건은 무엇인가?
     -
    문자열 s의 길이 : 100,000 이하의 자연수
     - 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

2. 계획

  1. s의 (개수와 )개수가 같다면 true

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (s) => {
  // s의(개수와)개수가 같다면 true
  let count = 0;
  for (i = 0; i < s.length; i++) {
    if (s[i] === '(') {
      count++
    } else {
      count--
    }
    if (count < 0) {
      return false
    }
  }

  return count === 0 ? true : false;
}

test('trueOrFalse', () => {
  expect(solution("()()")).toEqual(true);
  expect(solution(")()(")).toEqual(false);
  expect(solution('())())')).toEqual(false);
  expect(solution("())()(()")).toEqual(false);
});

4. 반성

  • 처음에 split을 사용해서 배열을 만든 다음에 map을 사용했는데 이렇게 되면 split을 사용할때와 map을 사용할 때 효율성이 O(N)이다. 그래서 효율성 테스트 할 때 통과가 안됐다.
  • 그래서 split을 사용하지 않고 그냥 문자열을 가지고 for 반복문을 사용했다. 문자열도 배열처럼 인덱스로 접근할 수 있다는 것을 알았다.
  • 또 처음에 문자열이 첫번째가 ')' 이거나 마지막이 '(' 인 경우 false를 리턴하게 했는데 효율성 테스트 하나를 통과하지 못했다. 이것도 for 문 안에서 해결이 되는 부분이라 코드를 지워주었더니 효율성 테스트 통과가 되었다.
  • 앞으로 효율성 측면에서 더 생각해보고 코드를 작성해야겠다.
  • 다른 문자열이 있을 경우 풀어보기
const solution = (s) => {
  const str = s.replace(/[^()]/gi, '');
  // s의(개수와)개수가 같다면 true
  let count = 0;
  for (i = 0; i < str.length; i++) {
    if (str[i] === '(') {
      count++
    } else {
      count--
    }
    if (count < 0) {
      return false
    }
  }

  return count === 0 ? true : false;
}

test('trueOrFalse', () => {
  expect(solution("()a()")).toEqual(true);
});

다른 문자열이 들어갈 경우 정규식을 사용해서 ()를 제외한 모든 문자열 제거를 했다.

 

 

댓글