출처: https://school.programmers.co.kr/learn/courses/30/lessons/76502
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
풀이
문제를 풀기 위해서는 크게 2가지를 해야 합니다. 1) 괄호 회전하기, 2) 올바른 괄호 문자열인지 확인하기 입니다.
1) 괄호를 회전하기
괄호를 회전하기 위해서는 괄호 문자열의 첫번째 문자를 마지막에 붙여주면 됩니다. 저는 substring과 concat을 사용해서 괄호를 회전했습니다.
2) 올바른 괄호 문자열인지 확인하기
올바른 괄호 문자열은 '('는 ')', '{'은 '}', '['은 ']'과 짝지어져야 합니다. 이런 유형(?)의 문제는 stack을 사용하면 쉽게 풀 수 있습니다. 열린 괄호는 스택에 넣어주고, 닫힌 괄호는 최상단 요소가 열린 괄호라면 pop 해주면 됩니다.
하지만 주의해야 할 점은 괄호의 종류를 맞춰야 한다는 것입니다. 이 점을 고려해서 코드를 짜면 다음과 같습니다.
소스코드
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
String newS = s;
for(int k=0; k<s.length(); k++){
Stack<Character> st = new Stack<>();
// 괄호 회전하기
newS = newS.substring(1, newS.length()).concat(newS.substring(0, 1));
for(int i=0; i<newS.length(); i++){
char c = newS.charAt(i);
// 스택이 비어있는 상태에선 일단 하나 추가합니다.
if(st.isEmpty()){
st.push(c);
}
else{
// 괄호가 열린 괄호일 때는 넣어주고
if(c == '[' || c == '(' || c == '{')
st.push(c);
// 닫힌 괄호라면 괄호 종류에 맞게 빼주면 됩니다.
else{
// 스택의 최상단 값과 현재 괄호가 맞는 관계라면 빼줍니다.
if(st.peek() == '(' && c == ')'){
st.pop();
}
else if(st.peek() == '{' && c == '}'){
st.pop();
}
else if(st.peek() == '[' && c == ']'){
st.pop();
}
// 맞는 괄호가 아니라면 올바른 괄호 문자열이 아닙니다.
else{
break;
}
}
}
}
// 올바른 괄호라서 잘 빼줬다면 스택이 비어있을 것이고,
// 아니라면 첫 번째에 넣은 값 때문에 스택이 비어있지 않을 것입니다.
if(st.isEmpty()) answer++;
}
return answer;
}
}
'Programming > Programmers' 카테고리의 다른 글
[프로그래머스] 42842번 - 카펫 (Java) (0) | 2023.06.17 |
---|---|
[프로그래머스] 12981번 - 영어 끝말잇기 (Java) (0) | 2023.06.17 |
[프로그래머스] 138476번 - 귤 고르기 (Java) (0) | 2023.06.14 |
[프로그래머스] 12914번 - 멀리 뛰기 (Java) (0) | 2023.06.14 |
[프로그래머스] 12953번 - N개의 최소공배수 (Java) (0) | 2023.06.14 |