[lv2] 괄호 회전하기

걸음걸음·2023년 2월 23일
0

Test

목록 보기
6/29

문제링크

  • (), []. {} 모두 올바른 괄호 문자열
  • 괄호가 겹쳐있어도 열고 닫기가 올바르면 올바른 괄호 문자열
  • 소괄호, 중괄호, 대괄호로 이루어진 문자열 s
  • s를 왼쪽으로 x칸(0<=x<s.length)만큼 회전시켰을 때 s가 올바른 문자열이 되는 횟수 return

스택(stack)
후입선출 구조를 가진 알고리즘

function solution(s) {
    const length = s.length;
    // 길이가 홀수일 경우 올바른 괄호 쌍이 맞는 경우 없음
    if(length%2 === 1) return 0;

  	const strArr = s.split('')
    let count = 0;
    // 왼쪽으로 한칸씩 이동
    for(let i = 0; i<length; i++){
        count += isValid(strArr,length)
        strArr.push(strArr.shift())
    }
    return count;
}

const isValid = (array, length) => {
    // 맞는 짝 찾으면 빼기
    // 마지막에 빈 배열이 되어야 올바른 괄호

    const stack = [];
    const open = ['(','[','{'];
    const close = [')',']','}'];
    for(let i = 0; i<length; i++){
        const now = array[i]
        // array[i] 가 여는 괄호면 stack에 추가
        if(open.includes(now)){
            stack.push(now)
        } else {
            // 여는 괄호가 아닐 경우
          	// 스택의 마지막 값과 비교해 같으면 빼기
            if(close.indexOf(now) === open.indexOf(stack[stack.length-1])){
                stack.pop()
            }
        }
    }
	// stack이 남아있으면(=쌍이 맞지 않으면) 0 반환, 아니면 1 반환
    return stack.length ? 0 : 1;
}

사용메서드 : 배열에 특정 값 포함 여부 체크

indexOf(), lastIndexOf()

  • indexOf() : 배열 안에서 찾으려는 값과 정확하게 일치하는 첫번째 인덱스 반환
  • lastIndexOf() : 배열 안에서 찾으려는 값과 정확하게 일치하는 마지막 인덱스 반환
    없으면 -1 반환
const arr = [1,2,3,1,2,3]
arr.indexOf(1) // 0
arr.lastIndexOf(3) // 5

includes()

includes() : 배열이 특정 값을 포함하고 있는지 여부를 boolean 값으로 반환
includes(x,y) : y인덱스 이후 x값을 포함하고 있는지 여부 판단

profile
꾸준히 나아가는 개발자입니다.

0개의 댓글