[CodeKata]Day8. 괄호 순서 확인

최송희·2021년 3월 11일
0

CodeKata

목록 보기
5/8

문제

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

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

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

s = "()"
return true

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

s = "(]"
return false 

s = "([)]"
return false

s = "{[]}"
return true

짱구굴리기

결국....한참 짱구를 굴려보았지만,,,실패하고
승옥님의 힌트를 듣고 다시 풀어보았다
우선 {,(,[ 왼쪽방향과 },),]오른쪽방향의 객체를 나눠서 분리한 뒤, 입력값 s를 포문돌리면서 왼쪽방향이 들어올 경우 빈 배열에 넣는다.
이후 다음 번에 오른쪽방향이 들어오면, 배열의 마지막과 방금들어온 오른쪽방향 괄호와 세트가 맞다면 배열에서 제거한다.
포문이 다 돌고난 뒤 배열에 아무것도 없으면 return true;

결과

function isValid(s) {
  // 여기에 코드를 입력해주세요.
  const left = {
    "{": 0,
    "[": 1,
    "(": 2,
  };
  const right = {
    "}": 0,
    "]": 1,
    ")": 2,
  };
  let stack = [];
  console.log(s.length);
  if (!(s.length % 2 === 0)) {
    //길이가 홀수이면 참일수없으니
    return false;
  }
  for (let letter of s) {
    // console.log(letter);
    if (Object.keys(left).indexOf(letter) > -1) {
      stack.push(letter);
    } else {
      if (stack.length < 1) {
        //  '}}' 요렇게 들어오는 경우 대비
        return false;
      }
      let finalLeft = stack[stack.length - 1];
      if (left[finalLeft] === right[letter]) {
        stack.pop();
      }
    }
  }
  // console.log(stack.length > 0);
  return stack.length > 0 ? false : true;
}

console.log(isValid("))"));

새로 배운점

  • 빈 배열에 .push() .pop()뒤에서부터 채워지고 뒤에서 부터 뺀다.
  • 요번거는 코딩문법 어려움 보다...네비게이션 하는데 어려움이 있었다! 다음에 비슷한 문제가 나오면 한방에 해결하즈아

0개의 댓글