반응형
https://programmers.co.kr/learn/courses/30/lessons/76502#
풀이
이 문제는 괄호로 이루어진 문자열을 왼쪽으로 회전해가면서 새로운 문자열을 만들고 그 문자열이 올바른 괄호로 이루어진지 확인하면 됩니다.
대부분 "괄호"가 나오는 문제들은 스택을 사용해서 풀립니다. 이 문제도 마찬가지구요!!
X = 0 ~ len-1 까지에 대해서 모두 확인을 해야합니다.
- 해당하는 X만큼 회전한 문자열을 생성합니다.
- 스택을 이용해서 올바른 괄호 문자열인지 확인합니다
스택을 이용해 올바른 괄호 문자열인지 확인하는 함수
- 여는 괄호의 경우 스택에 push
- 닫는 괄호의 경우 스택이 비어있는지, 스택의 top이 짝이 맞는 괄호인지 확인합니다.
- 문자열의 모든 문자에 대해 완료한 후에 스택이 비어있는지 여부를 확인합니다. (비어있지 않은 경우는 "{{" 이런 경우)
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
int len = s.length();
String move = "";
for(int i=0; i<len; i++){
//회전한 문자열 생성
String newS = "";
for(int j=i; j<len; j++)
newS = newS + s.charAt(j);
for(int j=0; j<i; j++)
newS = newS + s.charAt(j);
//올바른 괄호 문자열인지 확인
if(check(newS))
answer++;
}
return answer;
}
//올바른 괄호 문자열인지 확인하는 함수
boolean check (String newS){
Stack<Character> s = new Stack<Character>();
int len = newS.length();
for(int i=0; i<len; i++){
//여는 괄호는 스택에 push
if(newS.charAt(i) == '(')
s.push(newS.charAt(i));
else if(newS.charAt(i) == '[')
s.push(newS.charAt(i));
else if(newS.charAt(i) == '{')
s.push(newS.charAt(i));
//닫는 괄호는 스택의 top값과 비교
else if(newS.charAt(i) == ')'){
//여는 괄호 없이 닫는거 나옴
if(s.empty())
return false;
//짝이 안맞음
if(s.peek() != '(')
return false;
s.pop();
}
else if(newS.charAt(i) == ']'){
if(s.empty())
return false;
if(s.peek() != '[')
return false;
s.pop();
}
else if(newS.charAt(i) == '}'){
if(s.empty())
return false;
if(s.peek() != '{')
return false;
s.pop();
}
}
//여는 괄호가 더 많은 경우 스택이 비지 않음
if(!s.empty())
return false;
return true;
}
}
728x90
반응형
'알고리즘 > PS - 프로그래머스' 카테고리의 다른 글
[프로그래머스 - Java] [3차] n진수 게임 (0) | 2021.08.30 |
---|---|
[프로그래머스 - Java] 다음 큰 숫자 (0) | 2021.08.26 |
[프로그래머스 - Java] 모두 0으로 만들기 (0) | 2021.08.23 |
[프로그래머스 - Java] 2개 이하로 다른 비트 (0) | 2021.08.23 |
[프로그래머스 - Java] 스티커 모으기(2) (0) | 2021.08.21 |