문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예
s answer
"()()" true
"(())()" true
")()(" false
"(()(" false
입출력 예 설명
입출력 예 #1,2,3,4
문제의 예시와 같습니다.
class Solution {
boolean solution(String s) {
boolean answer = true;
int num = 0;
if(s.charAt(0) == ')'){
return false;
}else if(s.charAt(s.length()-1) == '('){
return false;
}else if(s.charAt(0) == '('){
for(int i=0;i<s.length();i++){
if(s.charAt(i) == '('){
num++;
}else if(s.charAt(i) == ')'){
num--;
}
if(num < 0){
return false;
}
}
}
return num == 0?true:false;
}
}
원래 코드는 괄호 개수를 카운트해서 ( 와 ) 개수가 맞는지 확인했다.
근데..다른 테스트랑 효율성 테스트도 성공했는데 자꾸 5번, 11번만 틀린다고 나왔다.
왜인지 찾아봤더니 개수가 맞아도 ())(() 이런 경우는 false인데 true로 되었던 것...ㅠㅠ
카운트하려고 int left, int right를 사용했는데 num으로 바꾸고 for문 안에 조건문 하나를 더 넣었다.
if(num < 0){
return false;
}
(()) 인 경우에는 첫 번째 (로 인해 num이 1이 되고 아래 조건문에 걸리지않는다.
())(() 인 경우 ()로 인해 num이 0이 되었지만 )로 인해서 num이 -1이 되어 아래 조건문에 걸린다.
false!
반복문을 끝내고 나와서 num이 0이면 괄호가 온전하게 들어있다는 의미니까 true를 리턴해주고
아닐 경우에는 false를 리턴해준다.
간단하지만 머리를 더 써봐야겠다. 스택으로 하는 방법도 찾아봐야지!
'코딩테스트 > JAVA' 카테고리의 다른 글
| [JAVA/프로그래머스] 문자열안에 문자열 (0) | 2023.06.08 |
|---|---|
| [JAVA/프로그래머스] 최솟값 만들기 (0) | 2023.06.07 |
| [JAVA/프로그래머스] JadenCase 문자열 만들기 (0) | 2023.06.05 |
| [JAVA/프로그래머스] 최댓값과 최솟값 (1) | 2023.06.04 |
| [JAVA/프로그래머스] 예산 (0) | 2023.05.31 |