🍀 코딩 테스트/알감자 스터디 (알고리즘 감 잃지말자)

1주차 문제 (올바른 괄호)

놀러와요 버그의 숲 2022. 6. 26. 11:06
728x90
반응형

 

 

아마 문자열과 관련이 되어있는 문제일 듯 해서 문자열 관련 메서드를 찾아보았다.

하단의 블로그를 참조하였다. 

https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-String-%EB%A9%94%EC%86%8C%EB%93%9C-%E2%9C%8F%EF%B8%8F-%EC%A0%95%EB%A6%AC

 

[JS] 📚 자바스크립트 String 메소드 💯 총정리

자바스크립트 String 메소드 String 객체는 원시 타입인 문자열을 다룰 때 유용한 프로퍼티와 메소드를 제공하는 레퍼(wrapper) 객체이다. 변수 또는 객체 프로퍼티가 문자열을 값으로 가지고 있다

inpa.tistory.com

또한 문자열의 특정 문자 개수 세는 법을 찾았다. 

https://deeplify.dev/front-end/js/count-characters-in-string

 

[Js/자바스크립트] 문자열의 특정 문자 개수 세는 방법

Javascript 문자열에서 특정 문자의 개수를 세는 방법에 대해서 소개합니다.

deeplify.dev

 

그래서 첫시도는 아래와 같이 풀었지만 실패했다.

대충 논리는 "("  그리고  ")" 의 갯수가 같으면서도 

string.lastIndexOf를 써서 ")" 가 "(" 보다 먼저 나오면 false를 하게 해주고 싶었다.

function solution(s){
   
var count1 = 0;
var count2 = 0;
var count3= 0;

var open = "(";
var close = ")";

var openNumber = s.indexOf(open);
var closeNumber = s.indexOf(close);

while (openNumber !== -1) {
  count1++;
  openNumber = s.indexOf(open, openNumber + 1);
}
while (closeNumber !== -1) {
  count2++;
  closeNumber = s.indexOf(close, closeNumber + 1);
}


if (count1 !== count2) {
  answer = false
}
else if (s.lastIndexOf(close) < s.lastIndexOf(open) ){ answer= false}
else{ answer = true}

    
return answer;
}

결과는 처참했다. 

효율성 테스트를 실패해서 아래와 같이 다시 풀었다.

function solution(s) {
  let count = 0;
  for (let i = 0; i < s.length; i++) {
    count += s[i] === "(" ? 1 : -1;
    if (count < 0) return false;
  }
  return count !== 0 ? false : true;
}

개인적으로 훨씬 깔끔한 느낌이긴 했다. 

아무튼 이번 문제를 통해서 올바른 괄호인지 판단할 때, 배운점은

 

[ ] 배열 안에서 올바른 괄호가 되면 서로 상쇄하는 느낌으로 짜는 것. count를 1, -1로 이렇게 해서 0이면 서로 올바른 괄호인 것.

그리고 닫힌 괄호가 먼저 나온다는 판단을 count <0 것으로 판단하는것이 관건이였다.