2023. 8. 31. 15:40ㆍAlgorithm/프로그래머스
문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 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 |
입출력 예 설명
입출력 예 #1
다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.
올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
입출력 예 #2
다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
입출력 예 #3
s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
입출력 예 #4
s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
풀이
사용 변수
nt answer = 0; //-> 정답
ArrayDeque<Character> dq = new ArrayDeque<>(); //-> deque로 구현
ArrayDeque<Character> stack; // -> stack으로 괄호 판별
boolean isValid = true; //-> 정상적으로 닫혔는지
설명
초기 아이디어는 deque를 이용하여 풀이하였습니다.
string 의 각 문자를 넣고, dq의 길이만큼 반복, 여는 괄호일 때에 스택에 추가, 닫는 괄호일 때에 스택에서 pop 해준 후에, 괄호를 회전해야 하므로, 판별 후에 바로 addLast를 통해 회전시켜 줬습니다.
하지만 이 과정에서 Null에러가 발생했고, 따라서 isValid 라는 boolean 형을 이용하여 정답여부를 관리했습니다.
소스코드
package prgmrs;
import java.util.ArrayDeque;
public class 괄호회전하기 {
public static void main(String[] args) {
String s1 = "[](){}";
System.out.println(solution(s1)); // 3
String s2 = "}]()[{";
System.out.println(solution(s2)); // 2
String s3 = "[)(]";
System.out.println(solution(s3)); // 0
String s4 = "}}}";
System.out.println(solution(s4)); // 0
}
static public int solution(String s) {
int answer = 0;
ArrayDeque<Character> dq = new ArrayDeque<>();
ArrayDeque<Character> stack;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
dq.addLast(c);
}
for (int i = 0; i < dq.size(); i++) {
stack = new ArrayDeque<>();
boolean isValid = true;
for (Character brks : dq) {
if (brks == '(' || brks == '{' || brks == '[') {
stack.addLast(brks);
} else {
if (stack.size() == 0) {
isValid = false;
break;
}
char close = stack.pollLast();
if (brks == ')' && close != '(') {
isValid = false;
break;
} else if (brks == '}' && close != '{') {
isValid = false;
break;
} else if (brks == ']' && close != '[') {
isValid = false;
break;
}
}
}
if (stack.size() == 0 && isValid) {
answer += 1;
}
dq.addLast(dq.pollFirst());
}
return answer;
}
}
느낀 점
점점 변수나 요소들을 추가하다보니, 코드가 지저분해지는 것 같습니다.
처음 설계를 완벽하게 하는 노력이 필요할 것 같습니다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 의상 (0) | 2023.09.05 |
---|---|
[프로그래머스] 줄 서는 방법 (0) | 2023.09.05 |
[프로그래머스] 숫자 짝궁 (0) | 2023.08.31 |
점프와 순간 이동 (0) | 2023.08.21 |
바탕화면 정리 (0) | 2023.08.21 |