1. 문제
- 입력받은 문자열 중 연속되는 2개의 문자가 있다면 제거하는 문제이다. 연속되는 문자가 없다면 0을 반환하고 연속되는 문자를 제거할 수 있다면 1 반환.
2. 의사코드
연속된 문자를 비교한다는 것을 보고 스택을 사용하여 문자 하나씩 추가하면서 비교하면 될 것 같았다.
1. 문자 하나씩 비교를 해야하기에 String이 아닌 Character 스택 생성
Stack<Character> stack = new Stack<>();
2. 빈 스택에 첫 문자를 추가하고, 이후에 추가할 때마다 값을 비교
stack.push(s.charAt(0));
for(인덱스 1부터 문자열 s길이만큼){
stack의 값과 새로 추가할 문자를 비교하여 같다면 삭제, 다르다면 추가
}
3. 시도
import java.util.Stack;
class Solution {
public int solution(String s) {
Stack<Character> stack = new Stack<>();
stack.push(s.charAt(0));
for(int i=1; i<s.length(); i++) {
char c = s.charAt(i);
if(stack.peek() == c) {
stack.pop();
} else if(stack.peek() != c) {
stack.push(c);
}
if(stack.isEmpty()) {
return 1;
}
}
return 0;
}
}
몇 개의 테스트를 제외하고 대부분 성공했고, 어디가 문제인지 제대로 파악하기 위해 프린트로 한 줄씩 확인했다.
테스트 2의 경우 문제는 없지만 테스트 1과 같은 경우에 발생한 문제였다. 스택이 다 끝나기도 전에 비었다면 1을 반환하는 문제였고 코드를 좀 더 간단히 수정하여 해결할 수 있었다.
class Solution {
public int solution(String s) {
Stack<Character> stack = new Stack<>();
for(char c : s.toCharArray()) {
if(stack.size() == 0) {
stack.push(c);
} else if (stack.peek() == c) {
stack.pop();
} else {
stack.push(c);
}
}
return stack.isEmpty() ? 1 : 0;
}
}
'자바 알고리즘' 카테고리의 다른 글
[프로그래머스 - Java] 추억점수 (0) | 2023.10.03 |
---|---|
[leetCode - Java/Hash] 819. Most Common Word (0) | 2023.09.29 |
[leetCode - Java/Two Pointer] 344. Reverse String (0) | 2023.09.27 |
[leetcode - Java / DFS] 133. Clone Graph (0) | 2023.09.15 |
[leetCode - Trie / Java] 208. Implement Trie (Prefix Tree) (0) | 2023.09.12 |