[BOJ] 9935번 : 문자열 폭발(Go, Golang)

김영한·2021년 3월 10일
0

알고리즘

목록 보기
19/74

문제 링크 : 백준 9935번

[문제 접근]

스택개념을 이용해서 푼 문제이다.(Go에는 stack STL이 없어서 슬라이스를 이용해서 구현)

  1. 스택 슬라이스에 기본 문자열을 하나씩 넣는다.
  2. 넣은 문자열이 폭발 문자열의 마지막 문자와 같으면 폭발 문자열이 포함되어 있을 수 있으므로 조건을 따져준다.
  3. 조건
    • 스택에 남은 길이가 폭발 문자열 길이보다 길어야한다.(이 조건이 없으면 0번째 인덱스보다 작은 인덱스를 참조하기 때문에 런타임 에러)
    • 스택의 끝부분에서 폭발 문자열 길이만큼을 폭발 문자열과 비교한다.
      • 같으면 스택에서 빼준다.
      • 아니면 계속 진행한다.
  4. 마지막으로 스택의 크기가 0보다 크면 스택을 출력해주고 크기가 0이면 FRULA를 출력해준다.

⭐️ c++은 string을 쪼개면 char이 되지만 Go에는 char형이 없기 때문에 string을 쪼개면 byte형이 된다. 따라서 stack은 byte형으로 선언해주고 폭발 문자열과 비교할때는 string으로 묶어줘서 비교해야한다.

[소스 코드]

package main

import (
	"bufio"
	"fmt"
	"os"
)

var (
	r    = bufio.NewReader(os.Stdin)
	w    = bufio.NewWriter(os.Stdout)
	s    string
	boom string
)

func main() {
	defer w.Flush()
	fmt.Fscan(r, &s, &boom)
	var stack []byte
	for i := 0; i < len(s); i++ {
		stack = append(stack, s[i])

		if stack[len(stack)-1] == boom[len(boom)-1] {
			if len(stack) < len(boom) {
				continue
			}
			if string(stack[len(stack)-len(boom):len(stack)]) == boom {
				stack = stack[:len(stack)-len(boom)]
			}
		}
	}
	if len(stack) > 0 {
		fmt.Fprintln(w, string(stack))
	} else {
		fmt.Fprintln(w, "FRULA")
	}
}

0개의 댓글