[Code Kata] Week 2 - Day 3

오지수·2021년 6월 30일
0

CodeKata

목록 보기
6/7
post-thumbnail

문제

s는 여러 괄호들로 이루어진 String 인자입니다. s가 유효한 표현인지 아닌지 true/false로 반환해주세요.

종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다. 아래의 경우 유효합니다. 한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다. 괄호 순서가 맞아야 한다.

예를 들어 아래와 같습니다.

s = "()"
return true

s = "()[]{}"
return true

s = "(]"
return false

s = "([)]"
return false

s = "{[]}"
return true

Code

일단 객체로 괄호들을 키와 value로 나누어서 활용해야할 것 같아서 나누긴 했다.

function isValid(s) {
  const bracket = {
    '(': ')',
    '{': '}',
    '[': ']'
  }
 }

하지만 아무리 시간이 흘러도 감을 잡지 못해서 구글링을 통해 reduce와 slice, pop과 push를 사용해서 이 기능을 구현할 수 있다는 힌트를 얻었다.

function isValid(s) {
  const bracket = {
    '(': ')',
    '{': '}',
    '[': ']'
  }
  
  const remained = s.split('').reduce((ac, cv, i, arr) => {
  
   if (bracket[ac.slice(-1)] === cv) {
      ac.pop();
    } else {
      ac.push(cv)
    }
    
    console.log(ac)
    return ac;
    
  }, []);
  
  return remained.length === 0;
}
  • '('로 시작하였을 때 반대쪽에 ')'가 있다면 언젠가는 만날 것이다.
  • 그래서 새 배열 안에서 짝이 되는 괄호의 한 쪽을 저장해두고 객체 키 값을 활용해서 최근에 들어온 괄호의 반대 괄호가 들어온다면 새 배열에 있는 괄호를 제거한다.
  • 이렇게 하면 인자로 받은 괄호의 짝이 전부 맞을 시[]로 출력될 것이다.
  • reduce는 콜백함수를 통해 배열 안의 요소를 누적할 수 있는 함수이다. 들어온 인자를 reduce한 결과의 길이가 0이라면 괄호의 짝이 다 존재한다는 말이니 true가 출력될 것이다.

if문을 만나기 전과 if문을 만난 후를 콘솔 로그로 띄우면 이런 식으로 동작한다.

profile
My Moto:: 내 스스로와 더불어 주변에게도 좋은 영향을 행사하도록 점검 & 노력..!!

0개의 댓글