https://school.programmers.co.kr/learn/courses/30/lessons/76502
조건
제한시간 : 40분 이내
시간 내에 푼 문제입니다.
로직은 전체적으로 두 가지로 나눌 수 있었습니다.
1. 왼쪽으로 shift 하면서 shift 한 값을 다시 문자열 끝에 붙여주는 작업,
2. shift 문자열을 가지고 올바른 괄호인지 판별
괄호 종류가 총 세 가지라, 괄호 쌍을 맞추게 된 건 집어 넣지 않고 pop() 하는 과정이 있는데,
그 부분은 HashMap 자료구조를 이용해서 괄호 자료를 미리 넣어두고 containsKey() 하는 식으로 처리했습니다.
import java.util.*;
class Solution {
HashMap<Character, Character> parenthesis = new HashMap<>();
public void init() {
parenthesis.put('{', '}');
parenthesis.put('(', ')');
parenthesis.put('[', ']');
}
public boolean isCorrectParenthesis(String s) {
char c = s.charAt(0);
if(c == ']' || c == '}' || c == ')') return false;
Stack<Character> stk = new Stack<>();
stk.push(c);
for (int i = 1; i < s.length(); i++) {
char target = s.charAt(i);
if(stk.isEmpty()) {
stk.push(target);
continue;
}
char topParenthesis = stk.peek();
if(parenthesis.containsKey(topParenthesis)) {
if(parenthesis.get(topParenthesis) == target) {
stk.pop();
continue;
}
}
stk.push(target);
}
if(stk.isEmpty()) return true;
else return false;
}
public int solution(String s) {
int count = 0; // 올른 괄호 문자열인 경우를 찾을 경우 +1
StringBuilder sb = new StringBuilder();
int len = s.length();
init();
for (int i = 0; i < len; i++) {
sb.append(s.substring(1, len)).append(s.substring(0, 1));
s = sb.toString();
sb.setLength(0);
if(isCorrectParenthesis(s)) {
count++;
}
}
return count;
}
}
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 *Java] - 2 x n 타일링 (0) | 2022.07.18 |
---|---|
[프로그래머스 *Java] - 배달 (0) | 2022.07.16 |
[프로그래머스 *Java] - 거리두기 확인하기 (0) | 2022.07.13 |
[프로그래머스 *Java] - 올바른 괄호 (0) | 2022.07.13 |
[프로그래머스 *Java] - 예상 대진표 (0) | 2022.07.12 |