[프로그래머스 lev2/JS] 괄호 회전하기

woolee의 기록보관소·2022년 10월 25일
0

알고리즘 문제풀이

목록 보기
18/178

문제 출처

프로그래머스 lev2 - 괄호 회전하기

문제 요약

주어진 문자열을 회전하면서, 올바른 문자열의 개수를 세서 반환

나의 풀이

// 1. 회전 구현
회전은 i for문 맨 마지막 s.push(s.shift());로 구현.

// 2. 괄호 짝 판별
회전하기 전에 올바른 괄호인지 판별한다.
tmp의 길이가 0이면 무조건 넣고, 그렇지 않다면
k for문을 순회하면서 짝이 맞는지 판별한 후, 짝이 맞다면 tmp에서 지워준다. 짝이 맞다면 바로 for문 나올 수 있게 break를 적절히 걸어준 뒤,

// 3. 올바른 괄호 판별
마지막에 짝이 안 맞을 경우에도 tmp에 넣어준다.
결과적으로 j for문을 전부 순회한 뒤, tmp에 하나라도 남아 있지 않아야 올바른 괄호이므로 ==0일 때 answer++;

function solution(s) {
  s=s.split('');
  let answer=0;
  const rs = [['(', ')'], ['[', ']'], ['{', '}']];

  for (let i=0; i<s.length; i++) {
    let tmp = [];
    for (let j=0; j<s.length; j++) {
      if (tmp.length==0) { tmp.push(s[j]); }
      else {
        let jud=false;
        for (let k=0; k<rs.length; k++) {
          if (tmp[tmp.length-1] == rs[k][0] && s[j] == rs[k][1]) {
            tmp.pop();
            jud=true;
            break;
          }
          if (jud==true) break;
        }
        if (jud==false) tmp.push(s[j]);
      }
    }

    if (tmp.length == 0) answer++;
    s.push(s.shift());
  }
  return answer;
}

console.log(solution("[](){}"))

다른 풀이

회전을 const temp = i === 0 ? s : s.slice(i) + s.slice(0, i); 로 구현한 풀이. 삼항 연산자를 활용하니 확실히 풀이가 짧다..!

function solution(s) {
  let answer = 0;
  for (let i = 0; i < s.length; i++) {
    const arr = [];
    const temp = i === 0 ? s : s.slice(i) + s.slice(0, i);
    for (let j = 0; j < temp.length; j++) {
      if (arr[arr.length - 1] === '(' && temp[j] === ')') arr.pop();
      else if (arr[arr.length - 1] === '[' && temp[j] === ']') arr.pop();
      else if (arr[arr.length - 1] === '{' && temp[j] === '}') arr.pop();
      else arr.push(temp[j]);
    }
    if (arr.length === 0) answer++;
  }
  return answer;
}

replace로 다 없어져도 그 최대값이 s.length/2 이므로

function solution(s) {
  var answer = 0;

  for (let i = 0; i < s.length; i++) {
      s = s.slice(1, s.length)+s[0];

      let string = s;

      for (let j = 0; j < Math.floor(s.length/2); j++) {
          string = string.replace(/([\[][\]]|[\{][\}]|[\(][\)])+/g, "");

          if (!string) break;
      }
      answer += !string ? 1 : 0;
  }
  return answer;
}
profile
https://medium.com/@wooleejaan

0개의 댓글