[replit]W2D3 괄호 짝 찾기

정승렬·2022년 9월 10일
0

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

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

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

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

문제 접근 방법
1. 입력이 문자열(string)이기 때문에 각 요소를 찾기 위해서는 문자열(string)을 배열에 담아준다
2. 각 괄호의 종류별로 번호를 부여해서 한쌍이 되면 두 괄호의 차이가 3이 되도록 객체로 선언 후 각 괄호를 숫자로 변환해준다
3. 배열을 전체 탐색하면서 배열[j]-배열[i]의 차가 3이면 결과 배열에 true를 넣어주고 다음 인덱스로 이동한다
4. 탐색중 배열이 열린 배열(객체로 변환 한 숫자가 3이하일때)이면 아무 동작을 하지 않고 다음 배열로 넘어간다
5. 3, 4번의 조건에 맞지 않은 경우는 전부 짝이 맞지 않은 괄호이기때문에 결과 배열에 false를 넣는다
6. 전체 탐색이 끝나면 결과(result)배열에는 true/false 둘중 하나의 값이 들어가 있게 된다
7. 이후 result 배열을 전체 탐색하여 false가 하나라도 있으면 결과값이 false가 나와야 하므로 false를 출력
8. 전체가 true이면 결과값으로 true 출력

추가로 고려해야 할 사항
1. 애초에 입력 받을때부터 괄호의 수가 홀수인 경우
-> 이 경우는 애초에 짝이 맞지 않아서 이후 연산이 무의미 하므로 바로 false 출력
2. 처음 들어온 입력값이 2개뿐이고 그 2개가 참이 아닐때
-> 이 경우는 result 배열에 인자가 입력되지 않아 result 배열의 길이가 0이면 false 출력


function isValid(s) {
  let arr = []
  arr = s.split("")
  let trans;
  let result = []
  string = {
    '(': 1,
    '{': 2,
    '[': 3,
    ')': 4,
    '}': 5,
    ']': 6
  }
  trans = arr.map(x => string[x])
  if(trans.length%2==1){
    return false
  }
  else{
  for (let i = 0; i < trans.length; i++) {
    for (let j = i + 1; j < trans.length; j++) {
      if ((trans[j] - trans[i]) === 3) {
        result.push(true);
        i++;
      }
      else if ((trans[j] - trans[i]) < 3) {
        i++;
      }
      else{
        result.push(false);
      }
    }
  }
  let isresult = true;
  for(let i=0; i<result.length; i++){
    if(result[i] === false){
      isresult=false
    }
  }
    if(result.length===0){
      return false
    }
  else if(isresult){
    return true
  }
  else {
    return false
  }
  }
}
const s = ']]'
console.log(isValid(s))

0개의 댓글