괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
s | answer |
---|---|
"()()" | true |
"(())()" | true |
")()(" | false |
"(()(" | false |
입출력 예 #1,2,3,4문제의 예시와 같습니다.
우선 문자의 첫 시작이 “)”
일 경우에는 오답이기 때문에 이에 해당하지 않는 문자열들로만 비교를 진행할 수 있도록 하였다.
그후 “(”
의 개수를 세는 lCnt
와 “)”
의 개수를세는 rCnt
변수를 만들었는데, 완벽한 괄호“()”
는 lCnt와 rCnt가 일치한다.
즉, 비교 도중 lCnt
보다 rCnt
가 커지면 참이 아니며, 완벽한 괄호를 이뤘을 경우에는 lCnt, rCnt
를 초기화 해주었다. 또한 완벽한 괄호를 이루지 않고 비교 연산이 끝난 경우 ( lCnt, rCnt
> 0 ) 역시 참이 아닐 것이다.
이를 코드로 표현하면 다음과 같다
class Solution {
boolean solution(String s) {
boolean answer = true;
String[] tmp = s.split("");
if (tmp[0].equals(")")) {
answer = false;
return answer;
}
int lCnt = 1;
int rCnt = 0;
for (int i = 1; i < s.length(); i++) {
if (tmp[i].equals(("("))) {
lCnt++;
} else if (tmp[i].equals(")")) {
rCnt++;
}
if (rCnt == lCnt) {
lCnt = 0;
rCnt = 0;
}
if (rCnt > lCnt) {
answer = false;
break;
}
}
if (rCnt > 0 || lCnt > 0) {
return answer = false;
}
return answer;
}
}
접근법은 괜찮았다고 생각하는데 효율성 코드를 통과하지 못하였다. 그래서 진행한 리팩토링은 불필요한 String
비교를 없애기 위해 String[]
배열을 없애고 char
로 비교하며, rCnt
와 lCnt
를 cnt
로 통합하였다.
class Solution {
boolean solution(String s) {
boolean answer = true;
int cnt = 0;
if (s.charAt(0) == ')') {
answer = false;
return answer;
}
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
cnt++;
} else if (s.charAt(i) == ')') {
cnt--;
}
if (cnt < 0) {
answer = false;
break;
}
}
if (cnt != 0) {
return answer = false;
}
return answer;
}
}
ㅇ