https://school.programmers.co.kr/learn/courses/30/lessons/76502
넣고 뺴기 쉬운 ArrayList로 진행. remove(0), add(arr.length()-1);
Stack에 "(" "[" "{" 이면 넣고 만약 "),},}" 라면 스택에서 뺏을때 해당값과 쌍이 아니라면 답이 아닌 경우로 cnt를 증가시키지 않습니다.
기억해야할점
첫번쨰, 괄호 문자열이 홀수일경우 모든 경우를 조사해도 올바른 괄호 문자열이 아니며, ( s.length() / 2 ) 로 진행해도 값이 나누어떨어지지않으면서 맞는것으로 나올때가 있습니다.
테스트케이스 12, 13 에서 시간초과가 걸렸는데
괄호 문자열이 만약
"()("
'("
"{{{{{{"
"()(" 일경우 길이가 3 이기에 나누면 1. 일때 () 가 한개 있으므로 1로 나와 답으로 측정되는 경우가 있습니다.
'(" 또한 나누면 0 이기에 cnt가 0 이면 맞는 결과가 있습니다.
그러므로 문자열 길이가 홀수면 바로 중단해야합니다.
코드입니다.
import java.util.*;
class Solution {
ArrayList<Character> arr = new ArrayList<>();
public int solution(String s) {
for(int i=0;i<s.length();i++){
arr.add(s.charAt(i));
}
int answer = 0;
//길이만큼 회전.
if(s.length() % 2 == 1)
return 0;
for(int i=0; i<s.length();i++){
Stack<Character> stack = new Stack<Character>();
// for(char a : arr){
// System.out.print(" "+a);
// }
// System.out.println();
int cnt = 0;
//검사한뒤
for(int j=0;j<s.length();j++){
if(arr.get(j) == '('){
stack.push(arr.get(j));
}else if(arr.get(j) == '['){
stack.push(arr.get(j));
}else if(arr.get(j) == '{'){
stack.push(arr.get(j));
}
else if(arr.get(j) == ')'){
if(stack.isEmpty()) break;
if(stack.pop() == '(') cnt += 1;
}else if(arr.get(j) == ']'){
if(stack.isEmpty()) break;
if(stack.pop() == '[') cnt += 1;
}else if(arr.get(j) == '}'){
if(stack.isEmpty()) break;
if(stack.pop() == '{') cnt += 1;
}
}
if(cnt == s.length() / 2) answer += 1;
// System.out.println(cnt);
//회전
Character temp = arr.remove(0);
arr.add(arr.size(),temp);
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]전화번호 목록 - 해쉬 + 아이디어 (0) | 2023.01.28 |
---|---|
[프로그래머스]이진 변환 반복하기 - 문자열 + StringBuilder (0) | 2023.01.25 |
[프로그래머스] 가장 먼 노드 - 다익스트라 + 그래프 (0) | 2023.01.10 |
[카카오 기출 문제]이모티콘 할인행사 - 레벨 2, 중복순열 + 구현 (0) | 2023.01.07 |
[카카오 기출 문제]택배 배달과 수거하기 - 레벨 2, 그리디 + 구현 (0) | 2023.01.07 |