📖 문제
https://school.programmers.co.kr/learn/courses/30/lessons/12909
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
🔑 풀이
[실패 1] LinkedList를 사용하여 )가 나오는 경우, 앞에 (가 있으면 return true하는 방식으로 풀었더니 효율성 실패
=> LinkedList 사용하지 않고 CharArray를 순환하는 방식으로 풀어 효율성 해결
[실패 2] s = "())(()" 와 같이 (와 )의 개수가 같고, 처음에 (, 마지막에 )가 오는데도 괄호가 아닌 경우가 있음
=> replace를 사용해 옳은 괄호를 먼저 지워 해결
[성공]
- ()를 공백으로 바꾼다
- )로 시작하거나 (로 끝나는 경우 return false
- (와 )의 개수가 다른 경우 return false
class Solution {
static boolean solution(String s) {
boolean answer = true;
// ()를 공백으로 바꿈
s=s.replace("()", "");
//(로 끝나거나 )로 끝나면 false
if (s.endsWith("(") || s.startsWith(")")) {
answer = false;
return answer;
}
// (와 )의 개수가 다른 경우 false
int a = 0, b = 0;
for (char c : s.toCharArray()) {
if (c == '(')
a++;
else if (c == ')')
b++;
}
if (a != b)
answer = false;
return answer;
}
}
✏️ 고찰
스택 문제 같아서 그렇게 풀려다가 그럼 어려울 것 같아서 안했다...
어차피 그렇게 풀었으면 효율성 실패했을듯? 연결리스트만 써도 효율성 실패 나오니깐
** 엥 근데 또 스택큐 카테고리에 들어있네.. 걍 내가 부족했던걸로^^...
replace를 replaceAll로 써놓고 안된다고 열받음....
replaceAll은 인자로 regular expression 사용하는거임 어쩐지 다 바뀌더라
String을 변환할 땐 String보다 char로 변환하는 편이 유리함을 기억하기
'알고리즘' 카테고리의 다른 글
[프로그래머스 Lv.2] 혼자서 하는 틱택토.java (1) | 2023.04.10 |
---|---|
[프로그래머스 Lv.2] 이진 변환 반복하기.java (0) | 2023.04.09 |
[프로그래머스 Lv.2] JadenCase 문자열 만들기.java (0) | 2023.04.06 |
[프로그래머스 Lv.2] 최댓값과 최솟값.java (0) | 2023.04.06 |
[프로그래머스 Lv.2] 최솟값 만들기.java (0) | 2023.04.06 |