[JS] 프로그래머스 코딩테스트 연습 | L2 괄호 회전하기

zaman·2022년 10월 13일
0

Coding test | Progranmmers

목록 보기
34/40
post-thumbnail

1. 문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
    대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

2. 제한사항

s의 길이는 1 이상 1,000 이하입니다.

3. 입출력 예

sresult
"[](){}"3
"}]()[{"2
"[)(]"0
"}}}"0

입출력 예 설명

입출력 예 #1

다음 표는 "{}" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?
0"[](){}"O
1"](){}["X
2"(){}[]"O
3"){}[]("X
4"{}[]()"O
5"}[](){"X

올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?
0"}]()[{"X
1"]()[{}"X
2"()[{}]"O
3")[{}]("X
4"[{}]()"O
5"{}]()["X

올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

문제풀이

function solution(s) {
  let answer = 0;
  // 홀수면 바로 0 리턴
  if (s.length % 2 == !0) return 0;
  s = s.split("");

  for (let i = 0; i < s.length; i++) {
    const stack = [];
    // 첫 번쨰 요소를 빼서 끝에 넣어줌
    let start = s.shift();
    s.push(start);
    // 배열 끝에 붙을 start가 {, [, ( 면 continue로 다음으로 넘김
    if (start === "{" || start === "[" || start === "(") continue;
    
    // stack 배열에 s의 첫 번째 요소를 넣어줌
    stack.push(s[0]);
    for (let j = 1; j < s.length; j++) {
      let last = stack[stack.length - 1];
      // {,[,(이 },],)를 만나면 pop
      last === "{" && s[j] === "}"
        ? stack.pop()
        : last === "[" && s[j] === "]"
        ? stack.pop()
        : last === "(" && s[j] === ")"
        ? stack.pop()
        : stack.push(s[j]);
    }
    // stack의 길이가 0이면 answer +1
    if (stack.length === 0) answer++;
  }

  return answer;
}

shift를 사용해서 시간이 오래걸렸다. 다른 사람 풀이를 보니까 s를 배열로 변환하지 않고 풀었던데 앞으론 그런식으로 풀어야겠다

다른 사람 풀이

풀이 방식이 유사했던 풀이

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;
}

mapping을 사용한 풀이

function solution(s) {
    if(s.length % 2 === 1) return 0;

    let answer = 0;
    const mapping = { "}" : "{", "]" : "[", ")" : "("};

    for(let i = 0; i < s.length; i++) {
        const stack = [];
        const rotate = s.slice(i) + s.slice(0, i);
        let flag = true;

        for(let j = 0; j < s.length; j++) {
            if(rotate[j] === "[" || rotate[j] === "(" || rotate[j] === "{" )
                stack.push(rotate[j]);
            else {
                const last = stack.pop();
                if(last !== mapping[rotate[j]]) {
                    flag = false
                    break;
                }
            }
        }

        if(flag) answer++;
    }

    return answer;
}
profile
개발자로 성장하기 위한 아카이브 😎

0개의 댓글