728x90
반응형
1. 오늘의 학습 키워드
[LeetCode] 2390. Removing Stars From a String/스택/큐/JAVA풀이
2. 오늘의 학습 문제
문제
https://leetcode.com/problems/removing-stars-from-a-string/description/
[LeetCode] 2390. Removing Stars From a String
You are given a string s, which contains stars *.
In one operation, you can:
- Choose a star in s.
- Remove the closest non-star character to its left, as well as remove the star itself.
Return the string after all stars have been removed.
Note:
- The input will be generated such that the operation is always possible.
- It can be shown that the resulting string will always be unique.
Example 1:
Input: s = "leet**cod*e"
Output: "lecoe"
Explanation: Performing the removals from left to right:
- The closest character to the 1st star is 't' in "leet**cod*e". s becomes "lee*cod*e".
- The closest character to the 2nd star is 'e' in "lee*cod*e". s becomes "lecod*e".
- The closest character to the 3rd star is 'd' in "lecod*e". s becomes "lecoe".
There are no more stars, so we return "lecoe".
Example 2:
Input: s = "erase*****"
Output: ""
Explanation: The entire string is removed, so we return an empty string.
Constraints:
- 1 <= s.length <= 105
- s consists of lowercase English letters and stars *.
- The operation above can be performed on s.
코드
/*
1. 스택 생성
2. s의 문자열을 하나씩 담는다.
3. *를 만나면 삽입하지 않고 pop
4. s를 모두 검사하고, 스택에 담긴 문자열 sort하여 반환
*/
import java.util.*;
class Solution {
Stack<Character> stack; //스택 선언
public String removeStars(String s) {
stack=new Stack<>(); //스택 초기화
addString(s);
System.out.println(stack);
String answer="";
while(!stack.isEmpty()){
answer+=stack.pop();
}
StringBuffer str= new StringBuffer(answer); //StringBuffer 클래스는 멀티쓰레드에 안전함
return str.reverse().toString();
}
private void addString(String s){
for(char c:s.toCharArray()){ //문자열을 문자 배열로 변환
if(c!='*')
stack.push(c);
else
stack.pop();
}
}
}
1. 스택 생성
2. s의 문자열을 하나씩 담는다.
3. *를 만나면 삽입하지 않고 pop
4. s를 모두 검사하고, 스택에 담긴 문자열 sort하여 반환
class Solution {
public String removeStars(String s) {
char[] arr = s.toCharArray();
int index = 0;
if(arr.length ==1 )return s;
for(int i = 0 ;i < arr.length ;i++){
if(s.charAt(i) == '*')index --;
else arr[index++] = s.charAt(i);
}
return String.valueOf(arr, 0, index);
}
}
해당 블로그 참고한 풀이
1. string을 문자열 배열로 바꾼다.
2. arr의 길이만큼 반복문을 수행하며 *가 아니면 arr[index]++에 문자를 담는다.
3. *라면 index--해주어 *의 최근접 왼쪽 문자를 삭제해줄 수 있음.
4. String.valueOf()메소드로 문자열 배열을 string으로 변환하고 0~index까지 문자열만을 리턴한다.
하나의 문자열 배열을 사용하여 메모리 사용량이 적고, index 변수를 통해 필요한 길이만큼만 반환한다.
String.valueOf() 메서드는 자바에서 다양한 타입의 값을 문자열로 변환하는 정적 메서드다.
다양한 타입의 인수를 받을 수 있다.
3. 오늘의 회고
- 스택을 사용하여 풀었는데, 속도가 느리고 메모리가 많이 사용되었다.
- String.valueOf()메서드를 알게 되었다. 다양한 메서드를 숙지하고 있으면 코드 작성에 도움이 된다.
- 15분 내에 문제를 빠르게 풀어서 기분이 좋았다!
728x90
반응형