https://programmers.co.kr/learn/courses/30/lessons/12973
import java.util.*;
class Solution {
public int solution(String s) {
List<Character> list = new ArrayList<>();
for (char i : s.toCharArray())
list.add(i);
boolean isChanged = true;
while (isChanged) {
isChanged = false;
for (int i=0; i< list.size()-1; i++){
if (list.get(i) == list.get(i+1)){
list.remove(i);
list.remove(i);
// i번째 데이터를 삭제하면 i+1이 i번째로 바뀌기 때문에 i를 두번 제거
isChanged = true;
}
}
}
if (list.size() == 0)
return 1;
return 0;
}
}
import java.util.*;
class Solution {
public int solution(String s) {
StringBuffer str = new StringBuffer(s);
boolean isChanged = true;
while (isChanged) {
isChanged = false;
for (int i=0; i< str.length()-1; i++){
if (str.charAt(i) == str.charAt(i+1)){
str.delete(i, i+2);
isChanged = true;
}
}
}
if (str.length() == 0)
return 1;
return 0;
}
}
import java.util.*;
class Solution {
public int solution(String s) {
Stack<Character> stack = new Stack<>();
for (char i: s.toCharArray()) {
if ((stack.size() >= 1) && (stack.peek() == i))
stack.pop();
else
stack.push(i);
}
if (stack.size() == 0)
return 1;
return 0;
}
}
초기 문제를 풀 때 String타입의 문자열을 character타입으로 하나씩 ArrayList에 넣은 뒤에 for문을 돌려가며 같은 i번째와 i+1번째의 수가 같으면 두 데이터를 삭제하는 방법으로 문제를 풀었다. 하지만 효율성 실패가 나와 StringBuilder방법으로도 변환하여 풀어봤으나 효율성 실패로 동일한 결과가 나왔다.
효율성이 낮게 나온 이유는 크게 2가지로 볼 수 있었다.
그래서 새로 생각한 방법은 stack이다.
데이터를 먼저 넣고 for문을 시행하는 것이 아닌 data가 들어갈 때마다 최상단에 위치한 data와 넣으려는 data를 비교하고 pop 또는 push를 수행하는 방법을 하였더니 코드가 무사히 통과되었다.
Stack stack = new Stack<>();
stack.peek(); -> 최상단 값 return
stack.push(data) -> data를 추가
stack.pop() -> 최상단 data를 삭제
stack.clear(); -> stack 초기화