· 문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
()() 또는 (())() 는 올바른 괄호입니다.
)()( 또는 (()( 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
· 제한 사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
· 입출력 예
s | answer |
()() | true |
(())() | true |
)()( | false |
(()( | false |
· Thinking 1
false 조건
1. 일단 ( 와 )의 개수가 다르면 false O
2. 연속된 ((의 개수와 ))의 개수가 다르면 flase
3. 시작이 )로 시작하면 false O
class Solution {
boolean solution(String s) {
boolean answer = true;
char[] chs = s.toCharArray();
int cntL = 0;
int cntR = 0;
if (chs[0] == ')') return false;
for (int i = 0; i < chs.length; i++) {
if (chs[i] == ')') cntR++;
else cntL++;
}
if (cntR != cntL) return false;
return answer;
}
}
정확성 : 84.6
· Thinking 2
예외 조건의 예시 :::::: ())) 추가
if (chs[chs.length-1] == '(') return false;
정확성 : 92.3
· Thinking 3
생각을 못한 예외 조건이 뭐지?
아 .. ()))((() 이거네
연속된 ((의 개수와 ))의 개수가 다르면 false 만족해야됨
if (cntL < cntL) return false;
((가 더 많을 순 있어도 ))가 더 많을 순 없음
· 완성 코드
class Solution {
boolean solution(String s) {
boolean answer = true;
char[] chs = s.toCharArray();
int cntL = 0;
int cntR = 0;
for (int i = 0; i < chs.length; i++) {
if (chs[i] == ')') cntR++;
else cntL++;
if (cntL < cntR) return false;
}
if (cntR != cntL) return false;
return answer;
}
}
· 문제 출처
https://programmers.co.kr/learn/courses/30/lessons/12909
댓글