ㅇ 문제
먼저 문제를 꼼꼼히 읽으며(그렇지 못했다. 그래서 한시간날림)
수도코드를 작성해보면,
// 1.문자열을 왼쪽으로 한칸씩 이동하는로직
// 첫번째문자 따로 빼놓기
// 두번째문자부터 한칸씩 왼쪽으로 이동
// 아까첫번째 문자는 맨마지막으로ㄱㄱ
// 2. 이과정에서 나온 char[]을 유효한지 검증
// 빈스택만들기
// 스택에 여는괄호면 푸쉬, 닫는괄호면 팝
// 두개 짝 맞는지 비교한다.
// 3. 이과정을 반복한다.
ㅇ 1트
public static int solution(String s) {
int answer = 0;
//문자열s 가 널이거나 비어있을경우 그냥 0
if (s == null || s.isEmpty()) {
return 0;
}
char[] chars = s.toCharArray();
//s길이-1만큼 반복
for (int move = 0; move < s.length() - 1; move++) {
char firstChar = chars[0];
// 두 번째 문자부터 한 칸씩 왼쪽으로 이동
for (int i = 1; i < chars.length; i++) {
chars[i - 1] = chars[i];
}
// 맨 뒤자리에 아까의 첫 번째 원소 넣기
chars[chars.length - 1] = firstChar;
Stack<Character> stack = new Stack<>();
// 올바른 괄호인지 검증
for (char bracket : chars) {
if (bracket == '{' || bracket == '(' || bracket == '[') {
stack.push(bracket);
} else {
if (stack.isEmpty()) {
answer = 0;//
break;
}
char openBracket = stack.pop();
if ((bracket == '}' && openBracket != '{') ||
(bracket == ')' && openBracket != '(') ||
(bracket == ']' && openBracket != '[')) {
answer = 0;
break;
}
}
}
if (stack.isEmpty()) {
answer++;
}
}
return answer;
}
힘들게 만들었는데, 자꾸 내가 원하는 답이 안나왔다.
ㅇ 2트
public static int solution(String s) {
int answer = 0;
//문자열s 가 널이거나 비어있을경우 그냥 0
if (s == null || s.isEmpty()) {
return 0;
}
char[] chars = s.toCharArray();
//s길이-1만큼 반복
for (int move = 0; move < s.length() - 1; move++) {
char firstChar = chars[0];
// 두 번째 문자부터 한 칸씩 왼쪽으로 이동
for (int i = 1; i < chars.length; i++) {
chars[i - 1] = chars[i];
}
// 맨 뒤자리에 아까의 첫 번째 원소 넣기
chars[chars.length - 1] = firstChar;
Stack<Character> stack = new Stack<>();
boolean isValid = true;
// 올바른 괄호인지 검증
for (char bracket : chars) {
if (bracket == '{' || bracket == '(' || bracket == '[') {
stack.push(bracket);
} else {
if (stack.isEmpty()) {
isValid = false;
break;
}
char openBracket = stack.pop();
if ((bracket == '}' && openBracket != '{') ||
(bracket == ')' && openBracket != '(') ||
(bracket == ']' && openBracket != '[')) {
isValid = false;
break;
}
}
}
if (isValid == true && stack.isEmpty()) {
answer++;
}
}
return answer;
}
answer를 자꾸 반복문에서 초기화시켜줬기 때문에 안되는거였다. 그래서 boolean을 써서 마지막 answer++ 부분에 isValid가 true이면서, stack이 전부다 빠져나왔을때 그제서야 answer++를해줬다. 그랬더니 테스트 11빼곤 다 통과된것이었다.
ㅇ 3트
다시 보니, 한번 옮기고나서부터 유효성을 검증하고 있었다. 다시 생각해보니 시작할때 문자열을 검증하지 않았던 것이다.
현재위치에서 유효성검증을 안했던것. 그래서 원래는 반복을 s의 길이-1만큼했지만 s길이만큼 반복을해서 왼쪽으로 이동을 계속해서 원래 모습까지 이동을 해서 처음 모습도 유효성 검증을 하는방법을 택했다. 주석처리 해놓은 밑에 반복문 에서 -1만 빼줬더니 모두 통과했다. 어이없다.
바보 벙슨
public static int solution(String s) {
int answer = 0;
//문자열s 가 널이거나 비어있을경우 그냥 0
if (s == null || s.isEmpty()) {
return 0;
}
char[] chars = s.toCharArray();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//s길이만큼 반복!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for (int move = 0; move < s.length(); move++) {
char firstChar = chars[0];
// 두 번째 문자부터 한 칸씩 왼쪽으로 이동
for (int i = 1; i < chars.length; i++) {
chars[i - 1] = chars[i];
}
// 맨 뒤자리에 아까의 첫 번째 원소 넣기
chars[chars.length - 1] = firstChar;
Stack<Character> stack = new Stack<>();
boolean isValid = true;
// 올바른 괄호인지 검증
for (char bracket : chars) {
if (bracket == '{' || bracket == '(' || bracket == '[') {
stack.push(bracket);
} else {
if (stack.isEmpty()) {
isValid = false;
break;
}
char openBracket = stack.pop();
if ((bracket == '}' && openBracket != '{') ||
(bracket == ')' && openBracket != '(') ||
(bracket == ']' && openBracket != '[')) {
isValid = false;
break;
}
}
}
if (isValid == true && stack.isEmpty()) {
answer++;
}
}
return answer;
}
이렇게 허무한 코테 끝ㅠ
스택사용법을 익혀두자.