Programmers - 올바른 괄호

Doodream·2021년 3월 20일
0

코딩테스트

목록 보기
4/22
post-thumbnail

💻 올바른 괄호


❓ 문제

https://programmers.co.kr/learn/courses/30/lessons/12909

✔️ 코드

function solution(s) {
    var answer = true;
    let sArr = s.split('');

    // 주어진 s가 짝수가 아니거나 처음이 '(' 마지막이 ')' 로 끝나지 않는 경우 x
    if (s.length % 2 !== 0 || sArr[0] !== '(' || sArr[s.length - 1] !== ')') {
        answer = false;
        return answer;
    }

    // '(' ')' 의 갯수가 동일하지 않은경우 x
    let openLetterCount = 0;
    let closeLetterCount = 0;

    sArr.map(x => {
        x === '(' ? openLetterCount++ : closeLetterCount++;
    })

    if (openLetterCount !== closeLetterCount) {
        answer = false;
        return answer;
    }

    // 문자열에서 괄호가 닫힌 경우를 모두 제거하고 (반복)제거 후 문자열로 통합
    sStr = s.split('()').join('');
    // 해당 문자열이 () 혹은 없는 경우 true
    if (sStr === '()' || sStr === '') {
        return answer;
    }

    // false 인 경우는 '()))((()' 이런 경우 이므로 바로 위코드를 수행하면 ')))(((' 이렇게 되어 거른다. 
    if (sStr[0] !== '(' || sStr[sStr.length - 1] !== ')') {
        answer = false;
        return answer;
    }

    return answer;
}

let s = "()))((()";
console.log(solution(s));

❗️풀이과정

먼저 실행시간을 단축시키기위해서 답에 합당한 조건들을 살펴보자

  1. 문자열의 길이는 짝수여야한다.
  2. 맨앞의 문자는 ( 여야한다.
  3. 맨뒤의 문자는 ) 여야한다.
  4. ( ) 각각 갯수가 같아야한다.
  5. ()인 형태를 문자열에서 반복적으로 지웠을 때 아무것도 남지 않아야한다.

위 조건들은 일부 겹치는 것들이지만 그래도 계산수가 낮은 순으로서 조금이라도 빠르게 답을 알수 있다.

  1. 5번 이후에 맨앞과 뒷문자를 확인 하는 절차를 다시해야한다.

📄 배운점

  • string.split('') : split 안의 문자로 주어진 string을 나눠서(나뉠때 split안의 문자로 나눠질때까지 계속 나눈다) 배열로 반환한다. ''로 나누게 되면 문자하나하나 배열에 넣어 반환된다.
  • arr.join(''): 주어진 배열을 join안에 주어진 문자를 이용해서 붙여서 string으로 반환한다. ''으로 붙인다면 그냥 전체 배열을 문자열로 변환하는것이나 마찬가지이다.
profile
일상을 기록하는 삶을 사는 개발자 ✒️ #front_end 💻

0개의 댓글