본문 바로가기
공부/2024 항해99코딩클럽

99클럽 코테 스터디 36일차 TIL + [LeetCode] 2390. Removing Stars From a String/스택/큐/JAVA풀이

by 푸딩코딩 2024. 6. 24.
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);
    }
}

https://0713k.tistory.com/87

해당 블로그 참고한 풀이

1. string을 문자열 배열로 바꾼다. 

2. arr의 길이만큼 반복문을 수행하며 *가 아니면 arr[index]++에 문자를 담는다.

3. *라면 index--해주어  *의 최근접 왼쪽 문자를 삭제해줄 수 있음.

4. String.valueOf()메소드로 문자열 배열을 string으로 변환하고 0~index까지 문자열만을 리턴한다.

 

하나의 문자열 배열을 사용하여 메모리 사용량이 적고, index 변수를 통해 필요한 길이만큼만 반환한다. 

String.valueOf() 메서드는 자바에서 다양한 타입의 값을 문자열로 변환하는 정적 메서드다. 
다양한 타입의 인수를 받을 수 있다. 

3. 오늘의 회고


 

  • 스택을 사용하여 풀었는데, 속도가 느리고 메모리가 많이 사용되었다. 
  • String.valueOf()메서드를 알게 되었다. 다양한 메서드를 숙지하고 있으면 코드 작성에 도움이 된다. 
  • 15분 내에 문제를 빠르게 풀어서 기분이 좋았다!

 

 

728x90
반응형