본문 바로가기
acmicpc/Java

[Java] 백준 9935번 문자열 폭발 952hi의 접근방법

by 952_hi 2022. 5. 6.

https://www.acmicpc.net/problem/9935

 

9935번: 문자열 폭발

첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모

www.acmicpc.net


1. 접근방법

문자열 비교 방식처럼 투포인터를 두고 체크하면서 진행하면 쉽게 풀수 있겠다라고 생각하고 배열로 접근을 했습니다. 근데 삭제처리를 했을때 남아있는 문자열이 있을때 인덱스 관리가 쉽지가 않아서 스택으로 방향을 바꿔서 생각했습니다. 스택을 통해서 구현을 하면 무조건 pop으로만 접근가능하다고 생각하고 접근했는데 스택 함수 쓰면서 get이라는 함수가 있어서 사용해보니 원하는 인덱스 접근이 가능해서 쉽게 풀 수 있었다.

 

중심적인 내용은 폭발시킬 문자열 길이보다 스택의 크기가 작다면 패스하고

크거나 같다면 안에 폭발시킬 문자열이 있는지 체크 있으면 pop 없으면 continue 하는 방식으로 처리했고

인덱스 같은경우 스택크기-폭발시킬문자열부터 ~ 폭발시킬 문자열의 크기만큼만 확인하는 방식으로 해결

 

마지막 스택크기가 0이면 모두터진상태니 FRULA 

있다면 0~스택크기만큼 출력 해주는 방식으로 해결했습니다.

2. 실수 및 느낀점

String 배열로 값을 담아서 진행했는데 계속 폭발이 진행이 안돼서 보니 조건문에서 ==으로 비교를 해줬다.. 간단하게 .compareTo(x) == 0이면 같은거니 이방식을 통해 처리했다.

 

스택에 갯함수 있는걸 이제알았는데 알아두면 잘 활용 할 수 있는 부분이라고 생각했다.

3. 코드

import java.io.*;
import java.util.Stack;
public class boj9935 {
	// boj 9935
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb =new StringBuilder();
		String[] temp = br.readLine().split("");
		String[] comp = br.readLine().split("");
		Stack<String> st = new Stack<>();
		
		int tempsize = temp.length;
		int compsize = comp.length;
		for(int i=0;i<tempsize;i++) {
			st.add(temp[i]);
			if(st.size()>=compsize) {
				boolean check = true;
				int size = st.size();
				for(int j=0;j<compsize;j++) {
					if(st.get(size-compsize+j).compareTo(comp[j])!=0) {
						check = false;
						break;
					}
				}
				if(check) {
					for(int k=0;k<compsize;k++) st.pop();
				}
			}
		}
		if(st.size()==0) sb.append("FRULA");
		else {
			for(int i=0;i<st.size();i++) {
				sb.append(st.get(i));
			}
		}
		System.out.println(sb.toString());
	}
}

 

 

배열쓰고 인덱스 관리 잘해야 속도적인 측면에서 이득을 많이 볼것같다

댓글