Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Thymeleaf
- PYTHON
- error
- LEVEL2
- 배포
- jpa
- 백엔드
- 9252
- leetcode
- 오류
- 백준
- 구현
- gold5
- 개념
- LCS
- leetcode 69
- java
- glod5
- mysql
- spring
- siver3
- LEVEL1
- HTML
- 프로그래머스
- Kakao
- Gold4
- gold2
- glod4
- CSS
- AWS
Archives
- Today
- Total
이 험난한 세상에서어어~
leetcode 844, Backspace String Compare 본문
문제 설명
문자열이 주어지는데, 이때 '#'부분은 backspace이다. 이때 두 문자열이 같으면 true, 다르면 false를 반환하는 문제다.
https://leetcode.com/problems/backspace-string-compare/description/
문제 풀이
stack
처음에는 단순 문자열 문제인 줄 알았지만, '#'이 연달아 나오는 예제를 보고 stack이라고 생각했다.
풀이 자체는 상당히 단순한데, 문자를 하나씩 탐색하다가 '#'이 나오면 stack에서 하나 pop을 한다. 이때 주의해야 할 점은 stack이 비었는지를 확인하는 것. 만일 문자가 '#'인데 stack이 비어 있다면 아무런 행위도 하지 않는다. 그리고 그냥 문자가 나온다면 stack에 push를 해주면 된다.
그리고 stack에 남은 값들을 하나씩 빼서 StringBuilder를 이용해 붙여주면 된다.
twopointer
투 포인터로 푸는 방법도 있길래 공유를 하자면, 만일 문자가 '#'이 아니라면 s[k]에는 현재 문자를 넣어주고 k는 ++를 한다. 그리고 이때 문자가 '#'이면 k를 한 칸 뒤로 물려준다. 이때 조심해야 할 것은 '#'이 맨 첫번째 나오는 경우. 그렇기에 max(k-1, 0)을 통해서 k가 0인 경우에는 0을 반환하도록 한다.
코드
java
import java.util.*;
class Solution {
public String deleteBackspace(String s) {
Stack<Character> stack = new Stack<>();
for (int i=0; i<s.length(); i++) {
if (s.charAt(i) == '#' && !stack.isEmpty()) {
stack.pop();
continue;
} else if (s.charAt(i) == '#' && stack.isEmpty()) {
continue;
}
stack.push(s.charAt(i));
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.toString();
}
public boolean backspaceCompare(String s, String t) {
//System.out.println(deleteBackspace(s));
//System.out.println(deleteBackspace(t));
return deleteBackspace(s).equals(deleteBackspace(t));
}
}
python
class Solution:
def backspaceCompare(self, s: str, t: str) -> bool:
def usingTwoPointers(s):
k=0
for i in range(len(s)):
if s[i] != '#':
s[k] = s[i]
k++
else:
# 0번째에 #이 오면 이것도 처리해줘야 한다
# k-1을 해서 직전의 값을 덮어씌우는 방식
k = max(k-1, 0)
return k
def deleteBackspace(s):
stack = []
string = ""
for i in range(len(s)):
if s[i] == '#' and len(stack) != 0:
stack.pop()
continue;
elif s[i] == '#' and len(stack) == 0:
continue;
stack.append(s[i])
string = ''.join(s for s in stack)
return string
return deleteBackspace(s) == deleteBackspace(t)
'algorithm > 코딩 테스트' 카테고리의 다른 글
[백준, 21847] 꿀 아르바이트(java) (0) | 2023.11.06 |
---|---|
백준 2096, 내려가기 (1) | 2023.11.01 |
leetcode 2050, Parallel Courses 3 (1) | 2023.10.19 |
프로그래머스, 최고의 집합(java) (0) | 2023.10.12 |
백준 9479, Strahler 순서(java) (1) | 2023.10.09 |