리뷰
입력 예시 -> "[ ] ( ) { } " (길이 6 문자열)
주어진 문자열을 1만큼 회전하면, 인덱스 0 번째 문자가 문자열의 제일 뒤로 간다. -> " ] ( ) { } [ "
입력 문자열을 연이어 붙이면 "[ ] ( ) { } [ ] ( ) { } " 가 된다. (길이 12 문자열)
크기 x 는 0부터 '문자열의 길이 -1' 까지다.
크기 0 | [ ] ( ) { } |
크기 1 | ] ( ) { } [ |
크기 2 | ( ) { } [ ] |
크기 3 | ) { } [ ] ( |
크기 4 | { } [ ] ( ) |
크기 5 | } [ ] ( ) { |
"[ ] ( ) { } [ ] ( ) { } "에서 0부터 6개를 잘라내서 올바른 괄호인지 검색한다.
1부터 6개 잘라내서 검사한다. 2부터 6개 잘라내서 검사한다.
이렇게 하면 괄호를 n만큼 회전한 문자를 구할 수 있다.
"맞았습니다" 코드
#include <string>
#include <vector>
#include <stack>
using namespace std;
int answer, ssize;
bool check(string s){ // 문자열이 올바른 괄호인지 확인하여 T/F 리턴
bool res = true;
stack<char> st;
for(int i = 0; i < ssize; i++){
if(s[i] == '{' || s[i] == '(' || s[i] == '['){
st.push(s[i]);
}else if(!st.empty()){
if( (st.top() - s[i] == -1) || (st.top() - s[i] == -2)){
st.pop();
}else{
res = false; break;
}
}else if(st.empty()){
if(s[i] == '}' || s[i] == ')' || s[i] == ']')
res = false; break;
}
}
if(!st.empty()) res = false; // 검사 후 스택이 비어있어야 올바른 괄호
return res;
}
int solution(string s) { // 괄호를 회전하면 괄호가 반복되니까 s를 이어붙임.
ssize = s.size(); // "[](){}" -> "[](){}[](){}"
s += s;
for(int i = 0; i < ssize; i++){ // 0부터 6개, 1부터 6개, 2부터 6개 ...
string target = s.substr(i, ssize);
bool result = check(target);
if(result) answer++;
}
return answer;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 피로도 c++ (0) | 2022.06.09 |
---|---|
[프로그래머스] 2 x n 타일링 c++ (0) | 2022.05.31 |
[프로그래머스] 압축 c++ (0) | 2022.05.27 |
[프로그래머스] 크레인 인형뽑기 c++ (0) | 2022.05.26 |
[프로그래머스] 튜플 c++ (0) | 2022.05.25 |