728x90
반응형
틱톡라이트 초대링크 https://lite.tiktok.com/t/ZSjqX7SfC/
[기간 한정] 보는 재미로, 버는 재미로! 영상만 봐도, 좋아요만 눌러도, 검색만 해도, 포인트가 차
www.tiktok.com
[ 괄호 회전하기 ] 코딩테스트 연습 > 월간 코드 챌린지 시즌2 > 괄호 회전하기

※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요 ※
[문제설명]
더보기



다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 1,000 이하입니다.
입출력 예

입출력 예 설명
입출력 예 #1
- 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

- 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
입출력 예 #2
- 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

- 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
입출력 예 #3
- s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
입출력 예 #4
- s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
[간단설명]
괄호로 만들어진 문자열을 한칸씩 이동시키면서, 올바른 괄호가 만들어지는 경우의 수 구하기
[접근방법]
1. 주어진 문자열을 char 배열로 저장한다.
2. 올바른 괄호인지 확인한다.
ㄴ 스택 사용
3. 문자열을 한칸씩 이동시킨다.
4. 주어진 문자열 길이만큼 반복한다.
5. 올바른 괄호 개수를 리턴
[주의사항]
- 괄호 문제는 스택으로 푸는 경우가 많다.
ㄴ 시작 괄호면 스택에 넣고, 종료 괄호면 스택에서 꺼내는 식으로 구현하자.
- 문자열이 시작 괄호( '(', '{' ,'[' )로 시작 안하는 경우가 있으니 주의하자.
[소스공개]
import java.util.*;
class Solution {
public int solution(String s) {
// 캐릭터 배열
char[] ch = new char[s.length()];
// 캐릭터 배열 세팅
int idx=0;
for(char c : s.toCharArray()){
ch[idx++] = c;
}
// 변수 초기화
idx=0;
int cnt=0;
while(idx<ch.length){
// 괄호가 올바르면
if(isCorrect(ch)){
cnt++; // 올바른 괄호 개수 +1
}
// 문자열 이동
ch = moveChar(ch);
idx++;
}
// 올바른 괄호 개수 리턴
return cnt;
}
// 문자열 이동
public char[] moveChar(char[] c){
char[] new_c = new char[c.length];
for(int i=0;i<c.length;i++){
new_c[i]=c[(i+1)%c.length]; // 한칸씩 뒤로 미룬다
}
return new_c;
}
// 올바른 괄호 판별
public boolean isCorrect(char[] c){
// 스택 사용
Stack<Character> stack = new Stack<>();
// 시작 괄호('[','(','{'] 개수 카운트
int cnt=-1;
for(int i=0;i<c.length;i++){
// 시작 괄호 이면 push
if(c[i]=='[' || c[i]=='(' || c[i]=='{'){
stack.push(c[i]);
cnt++;
// 종료 괄호 이면 pop
}else{
// 괄호 비교를 위해서 end값을 시작 괄호 값으로 세팅
char end='Z';
if(c[i]==']') end='[';
else if(c[i]==')') end='(';
else if(c[i]=='}') end='{';
// 스택이 비어있지 않고, 괄호가 같으면
// 위에서 종료 괄호를 시작 괄호로 바꿈
if(!stack.isEmpty() && end==stack.peek()){
char d = stack.pop();
}
}
}
// 시작괄호가 없으면 false
if(cnt==-1) return false;
// 스택 사이즈가 0이면 true(스택에서 모두 꺼냈으면)
return stack.size()==0?true:false;
}
}
[실행결과]

반응형
'코딩 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 행렬의 곱셈 (by 다알쥐AI) (0) | 2024.11.18 |
---|---|
[프로그래머스/JAVA] 코딩테스트 연습 > 월간 코드 챌린지 시즌3 > n^2 배열 자르기 (by 다알쥐AI) (0) | 2024.11.16 |
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 연속 부분 수열 합의 개수(by 다알쥐AI) (0) | 2024.11.16 |
[프로그래머스/JAVA] 코딩테스트 연습 > 2017 팁스타운 > 예상 대진표 (by 다알쥐AI) (1) | 2024.11.15 |
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 멀리뛰기 (by 다알쥐AI) (0) | 2024.11.15 |