짝지어 제거하기
프로그래머스 코딩테스트
주소 : https://school.programmers.co.kr/learn/courses/30/lessons/12973
풀이시간 : 약 1시간 30분
처음 접근 법은 그냥 반복문을 계속 돌려서 검증하는 방법이였습니다
public static int solution(String s)
{
int answer = -1;
int end = 0;
StringBuffer sb = new
StringBuffer();
sb.append(s);
int number = 0;
while (end <= 2) {
if(sb.length() == 0 || sb.length() == 1){
answer = 1;
break;
}
if (number + 1 > sb.length() - 1) {
end++;
number = 0;
}
System.out.println(sb.charAt(number) + " ::::
" + sb.charAt(number+1));
if (sb.charAt(number) == sb.charAt(number + 1)) {
sb.deleteCharAt(number);
sb.deleteCharAt(number);
end = 0;
}
System.out.println(sb);
number++;
}
if(sb.length() > 0){
answer = 0;
}
return answer;
}
[첫 문제풀이 코드]
하지만 제출 후 정답이지만 효율성을 보고 곰곰히 생각이 들었습니다.
효율을 따진다는 것은 일단 문제 자체는 간단한 문제니 최소 1번에서
2번만 순환해야 통과하겠구나
라는 생각이 들었습니다
곰곰히 생각 후 내린 결론은 stack을 사용 하자 였습니다.
사실 처음부터 스택을 생각해 두긴 했으나 무의식적으로 확실한 검증을 하려면
반복문을 여러 번 돌려야지 확실한 검증이 될거라 생각했었습니다
아래 수정된 코드입니다
public static int solution(String s)
{
int answer = -1;
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if(stack.isEmpty()){
stack.push(s.charAt(i));
}else{
if(s.charAt(i) == stack.peek()){
stack.pop();
}else{
stack.push(s.charAt(i));
}
}
}
if(stack.isEmpty()){
answer = 1;
}else{
answer = 0;
}
return answer;
}
이렇게 간단하게 문제를 해결할 수 있었습니다
스택을 통해 같은 값이 쌓이면 pop 시켜주고 아니면 push를 시켜줌으로서
전체 길이 한번만 순환해 만약 stack값이 남아있으면 0
모두 pop 되어 없어졌다면 1을
출력해줄 수 있습니다.