📘요구 사항 정리
- 짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작한다.
- 먼저 문자열에서 같은 알파벳이 2개 붙어있는 짝을 찾는다.
- 그 다음 그 둘(알파벳 2개 붙어있는 짝) 을 제거한뒤, 앞 뒤로 문자열을 다시 이어 붙인다.
- 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료된다.
- 성공적으로 수행시 1 반환
- 실패 시 0 번환
📌 제약 조건
- 문자열의 길이 : 1,000,000이하의 자연수
- 문자열은 모두 소문자로 이루어져 있습니다.
📌 구현코드 -1
package pra.lv2.짝지어제거하기;
import java.util.Stack;
public class answer_1 {
public static void main(String[] args) {
int result = solution("baabaa");
System.out.println(result);
}
public static int solution(String s) {
Stack<Character> list = new Stack<>();
int result =0;
for(int i=0;i<s.length();i++){
char data = s.charAt(i);
if(list.empty()){
list.push(data);
} else if (list.peek()==data) {
list.pop();
}else{
list.push(data);
}
}
if(list.isEmpty()){
result =1;
}
return result;
}
}
📌 구현코드 해설
- 문자열에서 데이터를 하나씩 꺼낸다.
- for문을 통해서 if - stack이 비어있다면, 문자를 하나 넣어준다.
- else - if로 stack이 비어 있지 않다면, 마지막 으로 들어간 문자를 꺼내고 현재 문자와 비교한 뒤 같으면 pop()해준다.
- 만약 비어 있지도 않고, 같지도 않으면 값을 push 해준다.
- for문을 다 돌고 list가 비어있다면 return 1을 해준다.
📌 구현코드 - 2
public static int solution2(String s) {
Stack<Character> list = new Stack<>();
for (Character data : s.toCharArray()) {
if (list.empty()) {
list.push(data);
} else if (list.peek() == data) {
list.pop();
} else {
list.push(data);
}
}
return list.empty() ? 1 : 0;
}
📌 구현코드 해설 -2
- 처음 코드에서 보완해서 사용할 수 있을 것 같아서 수정해보았다.
- for - each를 사용하여 바로 접근할 수 있도록 문자열을 toCharArray()를 사용하여 배열로 바꿔주었다.
- 아래와 같은 차례로 if문이 실행된다.
- stack이 비어있다면, 값을 추가해주고
- stack이 비어 있지 않다면, peek()을 통해서 마지막 문자와 현재 문자를 비교해준다.
- 마지막 문자와 현재 문자가 같다면
- 마지막 문자를 peek()해준다.
- 현재 문자는 push되지 않는다.
- 만약 값이 비어 있지도 않고, 마지막 문자와 같지도 않으면 stack에 값을 push해준다 .
- for문이 끝나면 stack이 비어 있는지 확인후, 비어 있다면 1 비어있지 않다면 0을 return해주었다.