code-kata(Week2 - Day3)(TIL)

sorin44·2022년 5월 18일
0
post-thumbnail

문제

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

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

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

s = "()"
return true

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

s = "(]"
return false

s = "([)]"
return false

s = "{[]}"
return true

s = "[]{}"
return true

나의 생각

처음 진행할 때 객체로 같은 종류의 괄호는 같은 값이 라고 지정해준다.
첫번째 괄호에서 같은 값이 두번째, 네번째 처럼 짝수의 값이 같아야지 true 가 나오고 두번째 괄호에서 같은 값이 세번째, 다섯번째 홀수의 값이 나와야지 true가 나오게 진행하는 방법을 생각했다.
하지만 이 함수의 맹점은 처음 i가 0이면 j가 -1 이 나와서 Undefined 가 되어 false 만 출력되게 되었다.

  const x = {
    '(': 'a',
    ')': 'a',
    '{': 'b',
    '}': 'b',
    '[': 'c',
    ']': 'c',      
  }  
  
  for (let i = 0; i < s.length ; i++) {
    for (let j = i - 1; j < s.length ; j += 2){
      if (i === 0) {
        continue;
      }
      
      if (x[s[i]] === x[s[j]]) {
        return true;
      } else {
        return false;
      }
    }   
  }

풀이

1번 풀이

시작하기전의 아이디어는 빈 배열을 선언해주고 같은 괄호인 '()', '{}', '[]' 가 연속으로 나오게 되면 배열에서 삭제를 해줘야한다.

  1. 빈 배열을 arr을 선언한다.
  2. 객체에 소괄호, 중괄호, 대괄호가 열고 닫는게 같은 값이라고 지정해준다.
  3. for 문을 사용하여 x = s의 값이 순서대로 나올 수 있도록 for문 안에 선언해준다.
  4. 만일 x의 값이 여는 괄호들이 나온다면 객체 obj의 값이 arr 빈 배열에 넣을 수 있도록 push 해준다.
  5. 그 외의 값(닫는 괄호들)이 나온다면 배열안의 값을 삭제해주는 pop함수를 사용해주는 left 변수를 선언해준다.
  6. else안에서 만일 x의 값이 left 와 일치하지 않는다면 false 를 return 해준다.
  7. 만약 false 가 아니고 남아있는 arr 배열의 길이가 0이라면 true를 반환하고 0이 아니라면 false 를 반환한다.
  let arr = [];
  let obj = {
    '(': ')',
    '[': ']',
    '{': '}'
  }
  for (i = 0; i < s.length; i++) {
    let x = s[i];
    if (x === '(' || x === '[' || x === '{') {
      arr.push(obj[x]);
    } else {
      let left = arr.pop();
      if (x !== left) return false;
    }
  }
 return arr.length === 0 ? true : false; 

2번 풀이

재성님의 코드를 보고 더 쉬운 방법이 있어서 참고하게 되었다.
가정은 위의 1번 풀이 과정과 동일하나 훨씬 쉽게 작성할 수 있다.

  1. while 함수를 이용하여 순서대로 s문자열 안에 () or {} or [] 가 나타난다면 빈 배열로 선언해준다.
    1-1. while 안에서 includes('[]') 를 굳이 작성하지 않은 이유는 나머지 괄호들만 지정해주면 알아서 나머지 [] 의 값도 알아서 붙어있으면 삭제 시킬 수 있기 때문이다.
  2. replace method를 이용하여 열고 닫히는 괄호가 있다면 빈 문자열 바꿔준다.
  3. 마지막으로 s의 값이 빈 문자열로 도출 된다면 true, 그것이 아니라면 false 로 return 해준다.
  while(s.includes('()')||s.includes('{}'))
    s=s.replace('()','')
    s=s.replace('{}','')
    s=s.replace('[]','')
  return s == ''? true : false

참고 및 출처
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/while
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace

profile
프론트엔드 개발자입니다.

0개의 댓글