다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
s의 길이는 1 이상 1,000 이하입니다.
s | result |
---|---|
"[](){}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "[](){}" | O |
1 | "](){}[" | X |
2 | "(){}[]" | O |
3 | "){}[](" | X |
4 | "{}[]()" | O |
5 | "}[](){" | X |
올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "}]()[{" | X |
1 | "]()[{}" | X |
2 | "()[{}]" | O |
3 | ")[{}](" | X |
4 | "[{}]()" | O |
5 | "{}]()[" | X |
올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
(string).charCodeAt((index))를 사용하였다.
- 문제 풀기 전, charCodeAt()사용을 위해 알아야 할 점
필자의 경우, 문제를 풀며 인터넷을 찾아볼 순 없으니 아스키코드값을 알기 위해 Console.log를 사용해 값을 확인해주었다.
- (, )의 아스키코드값은 40, 41
- [,]의 아스키코드값은 91, 93
- {,}의 아스키코드값은 123, 125
우선, s문자열을 배열brc 로 바꿔주기 위해 s.split("")을 사용했다.
이후 배열 brc의 길이만큼 반복문을 돌려준다.
반복문 내부에서 실행되는 것은 다음과 같다.
1. checking(brc)함수
2. brc의 0번째 인자를 pop()으로 꺼내주기
3. brc에서 꺼낸 인자를 push()로 맨 마지막에 넣어주기
checking함수에서 실행되는 것은 다음과 같다.
1. 임시 배열 t 초기화
2. t에 brc의 가장 첫 번째 인자의 아스키 코드 값 넣어주기.
3. brc의 1번째부터 마지막번째 인자 확인을 위한 반복문 실행
3-1. 만약 t의 마지막 인자값과 (brc[i]의 아스키코드값)-1 혹은 -2를 한 값이 같으면, t의 마지막 인자 pop()으로 꺼내주기.
3-2. 3-1실행을 못 했을 경우, t에 brc[i]의 아스키코드값을 push()로 넣어주기
4. 반복문 실행 완료 후 t의 길이가 0이라면 answer++후 true 리턴. t의 길이가 0이 아니라면 false리턴
function solution(s) {
var answer = 0;
var t = [];
var temp = 0;
var brc = s.split("");
function checking(str){
t = [];
t.push(str[0].charCodeAt(0));
for(let i=1; i<str.length; i++){
if(t[t.length-1]==str[i].charCodeAt(0)-1 || t[t.length-1]==str[i].charCodeAt(0)-2){
t.pop();
}
else{
t.push(str[i].charCodeAt(0));
}
}
if(t.length==0){
answer++;
return true;
}
return false;
}
for(let i=0; i<brc.length; i++){
checking(brc);
temp = brc.shift();
brc.push(temp);
}
return answer;
}
사실 처음 코드를 작성한 뒤 실행했는데 계속 테스트케이스 통과를 못해서 의아했다.
console.log로 반복문 중간중간 출력을 해서 보았는데도 테스트케이스를 왜 통과하지 못하는지 몰랐다.
알고보니 answer의 초기값이 -1로 되어있어서 0으로 고쳐주었다.
실제 문제 풀이 상황이었으면 많이 당황했을 것 같다.