[BOJ] 9935. 문자열 폭발

2022. 10. 21. 05:31·algorithm

문제

상근이는 문자열에 폭발 문자열을 심어 놓았다. 폭발 문자열이 폭발하면 그 문자는 문자열에서 사라지며, 남은 문자열은 합쳐지게 된다.
폭발은 다음과 같은 과정으로 진행된다.

  • 문자열이 폭발 문자열을 포함하고 있는 경우에, 모든 폭발 문자열이 폭발하게 된다. 남은 문자열을 순서대로 이어 붙여 새로운 문자열을 만든다.
  • 새로 생긴 문자열에 폭발 문자열이 포함되어 있을 수도 있다.
  • 폭발은 폭발 문자열이 문자열에 없을 때까지 계속된다.
    상근이는 모든 폭발이 끝난 후에 어떤 문자열이 남는지 구해보려고 한다.
    남아있는 문자가 없는 경우가 있다.
    이때는 "FRULA"를 출력한다.
    폭발 문자열은 같은 문자를 두 개 이상 포함하지 않는다.

입력
첫째 줄에 문자열이 주어진다.
문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다.
둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다.
두 문자열은 모두 알파벳 소문자와 대문자, 숫자 0, 1, ..., 9로만 이루어져 있다.

출력
첫째 줄에 모든 폭발이 끝난 후 남은 문자열을 출력한다.

해결 방법

  • 2초에서 틀렸습니다가 나옴
    • 폭발 문자열의 각각의 문자로 입력문자열에서 같은 것들을 다 없애버렸기 때문
    • 폭발 문자열은 '문자열'이다. 문제 이해 잘못해서 나온 결과
  • contains와 replace를 사용해봄
    • 메모리 초과 발생
    • replace를 할 때마다 String 객체를 새로 생성하기 때문에 낭비되는 메모리가 많다.
    • Stack을 사용해야 한다는 글을 봄
  • 입력문자열을 끝에서부터 char로 stack에 넣음
  • stack의 길이가 폭탄과 같거나 길어지고 폭탄 문자열의 첫 문자와 stack.peek이 같으면
  • flag = true
  • stack의 나머지 값들과 폭탄 문자열의 나머지 값들을 비교해서 같지 않으면 flag = false
  • 같으면 -> 같은 문자열이라는 뜻이기 때문에 stack에 쌓여있는 폭잔 문자열을 없애버림
  • 이것을 입력 문자열 길이만큼 반복
  • stack이 비어있으면 FRULA 출력
  • 비어있지 않으면 stack 안의 문자를 문자열로 출력
    public class Week02_9935 {
      public static void main(String[] args) throws IOException {
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
          Stack<Character> stack = new Stack<>();
          String s = br.readLine();
          String bomb = br.readLine();
          // 문자열 안의 폭탄문자열을 삭제하는 로직
          for (int i = s.length() - 1; i >= 0; i--) {
              stack.push(s.charAt(i));
              if (stack.size() >= bomb.length() && bomb.charAt(0) == stack.peek()) {
                  boolean flag = true;
                  for (int j = 1; j < bomb.length(); j++) {
                      if (stack.get(stack.size() - 1 - j) != bomb.charAt(j)) {
                          flag = false;
                      }
                  }
                  if (flag) {
                      for (int k = 0; k < bomb.length(); k++) {
                          stack.pop();
                      }
                  }
              }
          }
          if(stack.isEmpty()) bw.write("FRULA");
          while (!stack.isEmpty()) {
              bw.write(stack.pop()+"");
          }
          bw.flush();
          bw.close();
          br.close();
      }
    }
저작자표시 (새창열림)

'algorithm' 카테고리의 다른 글

[BOJ] 9095. 1,2,3 더하기  (0) 2022.10.28
[BOJ] 10819. 차이를 최대로  (0) 2022.10.27
[BOJ] 1764. 듣보잡  (0) 2022.10.21
[BOJ] 17298. 오큰수  (0) 2022.10.21
[BOJ] 2309. 일곱 난쟁이  (0) 2022.10.21
'algorithm' 카테고리의 다른 글
  • [BOJ] 9095. 1,2,3 더하기
  • [BOJ] 10819. 차이를 최대로
  • [BOJ] 1764. 듣보잡
  • [BOJ] 17298. 오큰수
siio
siio
  • siio
    siio's blog
    siio
  • 전체
    오늘
    어제
    • category (47)
      • Projects (4)
      • Java (1)
      • Spring (0)
      • DevOps (0)
      • algorithm (42)
      • 회고 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    risingcamp
    Cross Domain
    ncp
    jvm
    BufferedReader
    git #github #협업프로세스
    dfs
    same site
    JDK
    외판원순회
    10971
    Scanner
    http only cookie
    Knapsack
    SWYP
    jre
    DP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
siio
[BOJ] 9935. 문자열 폭발
상단으로

티스토리툴바