programmers.co.kr/learn/courses/30/lessons/76502
[문제 설명]
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 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 |
[풀이]
문제 그대로 한 칸씩 왼쪽으로 이동시키면서 괄호들이 잘 매칭 되는지 파악하면 되는 문제이다.
이런 괄호 문제일 경우 스택을 자주 사용하는데
여는 괄호면 스택에 push 해주고 닫는 괄호면 최근에 스택에 쌓인 괄호가 닫는 괄호와 매칭이 되는지 판단하여 문제를 풀어주면 된다.
[코드]
/**
* level 2 / 월간 코드 챌린지 시즌2
* 괄호 회전하기
* https://programmers.co.kr/learn/courses/30/lessons/76502
*/
public int solution(String s) {
int answer = isCorrect(s); //for문을 돌면서 한칸 씩 이동 시키기 전 수행
for(int i = 1; i < s.length(); i++) {
s = s.substring(1) + s.charAt(0); //왼쪽으로 한칸 씩 이동
answer += isCorrect(s); //올바르지 않으면 + 1
}
return answer;
}
public int isCorrect(String s) {
Stack<Character> stack = new Stack<>();
try {
//스택에 넣기
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '}') { //닫는 괄호}, ), ] 일 때 스택에 최근에 쌓인 괄호가 여는 괄호인지 판단
if(stack.peek() != '{') {
return 0;
}
stack.pop();
}else if(s.charAt(i) == ']') {
if(stack.peek() != '[') {
return 0;
}
stack.pop();
}else if(s.charAt(i) == ')') {
if(stack.peek() != '(') {
return 0;
}
stack.pop();
}else { //여는 괄호(, {, ( 면 스택에 추가
stack.add(s.charAt(i));
}
}
}catch (Exception e) { //빈 스택 참조시 발생할 수 있는 에러 예방
return 0;
}finally {
if(stack.size() > 0) return 0; //모든 케이스가 여는 괄호 일 때, ex= {{{{{
}
return 1;
}
반응형
'코딩테스트 > 프로그래머스 level 2' 카테고리의 다른 글
[프로그래머스 level_2] 가장 큰 수 for JAVA (0) | 2021.05.15 |
---|---|
[프로그래머스 level_2] 기능개발 for JAVA (0) | 2021.05.11 |
[프로그래머스 level_2] 프린터 for JAVA (0) | 2021.05.05 |
[프로그래머스 level_2/월간 코드 챌린지 시즌1] 이진 변환 반복하기 for JAVA (0) | 2021.03.15 |
[프로그래머스 level_2 / 월간 코드 챌린지 시즌 1] 쿼드압축 후 개수 세기 for JAVA (0) | 2020.11.05 |