일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- 1389자바
- 노트북 서버
- mobaXTerm
- 1389 JAVA
- 백준 2615
- 1012 자바
- Expo
- 백준 5430자바
- 백준 1697 자바
- BFS
- 1697 자바
- 백준 1012 자바
- 5430 java
- React Native
- 백준
- ubuntu
- 백준 1389 자바
- Ubuntu USB부팅
- 1012 java
- 5430자바
- 백준 1012 java
- 백준 유기농 배추
- 퇴사
- 알고리즘
- Today
- Total
삽질메모장
백준 9935번: 문자열 폭발 (java) 본문
https://www.acmicpc.net/problem/9935
9935번: 문자열 폭발
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모
www.acmicpc.net
문제
난이도 : 골드 4
유형 : 문자열, 스택
몇년만에 알고리즘 한문제를 풀어봤는데 문제부터 이해를 잘 못했다.
처음문제를 보곤 ABCD 라는 원문에 폭발문자열이 AC 면은 출력으로 BD 가 나오는것으로 이해하고 풀이했고
당연히 통과 될리가 없었다.
문제를 이해하지 못한거 같아 검색하여 다른분의 구상을 보니 애초에 문제를 잘못이해했단걸 알았고
이미 다른사람의 풀이 구상을 읽어버려서 그 흐름대로 짜게됐다
사고흐름
1. 사실 stack 이 아니라 queue 를 써도 구현은 똑같이 가능할 것 하지만 다른사람 글을 봐버려서 stack으로 사고..
2. 입력받은 문자열을 하나씩 stack에 push 하면서 폭발 문자열 길이와 같거나 큰지 비교한다
3. 조건에 해당하면 stack.size-폭발문자 사이즈 ~ stack.size 끝 까지 폭발문자열과 비교한다.
3-1. 이때 폭발문자열 패턴과 맞지않으면 flag = false로 변경 -> 추후 break 추가
3-2. 모두 일치하면 flag=ture 인 상태이므로 해당 길이의 문자를 pop 한다.
풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String inputText = sc.next();
String inputBomb = sc.next();
int bombleng =inputBomb.length();
char[] OriginArray =inputText.toCharArray();
char[] OriginBomb = inputBomb.toCharArray();
Stack originStack = new Stack();
for(int i =0; i < inputText.length(); i++) {
originStack.push(OriginArray[i]);
boolean flag = true; //탐색전 true 초기화
//탐색문자와 bomb 문자 같아지면 탐색 시작
if(originStack.size() >= bombleng){
for(int j = 0; j <bombleng; j++ ){
if(!originStack.get(originStack.size()-bombleng +j).equals(OriginBomb[j])){
flag = false;
}
}
if(flag){ //플래그 걸린거 하나도없으면 문자열폭발
for(int popindex = 0; popindex<bombleng; popindex++){
originStack.pop();
}
}
}
}
StringBuilder sb = new StringBuilder();
for(Object c : originStack){
sb.append(c);
}
if(originStack.size() == 0){
System.out.println("FRULA");
}else{
System.out.println(sb);
}
}
}
아래와 같이 실행시간이 두배나 차이가 난다.
가장 큰 원인은 flag = false 가 나왓으면 더 이상 탐색할 필요가 없기에 break를 해주는것이 올바르다.
-참조글
'Knowledge > 알고리즘' 카테고리의 다른 글
백준 1244번: 스위치 켜고 끄기(java) (0) | 2023.12.06 |
---|---|
백준 1018번: 체스판 다시 칠하기(java) (0) | 2023.12.05 |
programmers : stack queue 4(주식가격)[java] (0) | 2022.01.11 |
programmers : stack queue 2 (프린터)[java] (0) | 2022.01.11 |
programmers : stack queue 1 (기능개발)[java] (0) | 2022.01.11 |