9935번: 문자열 폭발
첫째 줄에 문자열이 주어진다. 문자열의 길이는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 둘째 줄에 폭발 문자열이 주어진다. 길이는 1보다 크거나 같고, 36보다 작거나 같다. 두 문자열은 모
www.acmicpc.net
[코드]
import java.io.*; import java.util.*; class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); char[] strings = br.readLine().toCharArray(); char[] exp = br.readLine().toCharArray(); StringBuilder sb = new StringBuilder(); /* 알고리즘 1. StringBuilder에 문자를 차례대로 넣어준다. 2. StringBuilder 길이가 폭발문자열의 길이와 같거나 큰지 확인한다. 3. 만약 크다면 StringBuilder의 맨끝에서부터 폭발문자와 같은지 확인한다. 4. 만약 같다면 해당 문자열을 삭제한다. */ for (int i = 0; i < strings.length; i++) { sb.append(strings[i]); //문자를 차례대로 넣어준다. if (sb.length() >= exp.length) { //폭발문자열의 길이와 비교한다. boolean check = true; // 만약 false가 되면 폭발문자열과 불일치한다. for (int j = 0; j < exp.length; j++) { char ch = exp[j]; char sc = sb.charAt(sb.length() - exp.length + j); //문자열 끝에서부터 확인한다. if (ch != sc) { check = false; break; } } if (check) sb.delete(sb.length() - exp.length, sb.length()); //폭발문자열과 같다면 해당 문자열을 삭제한다. } } if (sb.length() == 0) bw.write("FRULA"); else bw.write(sb.toString()); bw.close(); } } |
[문제풀이]
처음 문제를 보고 String.replace()을 활용하여 풀었는데 메모리초과가 나왔다. 그 이유는 String은 불변이면서 참조타입이기 때문에 Heap영역에 데이터를 저장하는데 String.replace()를 할 때마다 새로운 String을 할당하기 때문이다.
그렇기 때문에 가변 속성을 가진 StringBuilder나 스택을 사용하여 문제를 풀어야한다.
'백준' 카테고리의 다른 글
[백준/JAVA] 1946번: 신입 사원 (0) | 2023.02.06 |
---|---|
[백준/JAVA] 2217번: 로프 (0) | 2023.02.02 |
[백준/JAVA] 1916번 최소비용 구하기 (0) | 2023.01.30 |
[백준/JAVA] 7662번 이중 우선순위 큐 (0) | 2023.01.30 |
[백준/JAVA] 17251번: 힘 겨루기 (0) | 2023.01.16 |