시리즈: 알고리즘 (32개 글)
- 자바로 알고리즘 풀기
- [Java] 백준 10431 - 줄 세우기
- [Java & Node.js] 백준 9935 - 문자열 폭발
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 4485 - 녹색 옷 입은 애가 젤다지?
- [Node.js] 백준 1283 - 단축키 지정
- [Java & Node.js] 백준 14469 - 소가 길을 건너간 이유 3
- [Java] 백준 8979 - 올림픽
- [Node.js] 백준 22866 - 탑 보기
- [Java] 백준 7568 - 덩치
- [Java] 백준 1244 - 스위치 켜고 끄기
- [Node.js] 백준 19941 - 햄버거 분배
- [Node.js] 백준 1254 - 팰린드롬 만들기
- [Java] 백준 2589 - 보물섬
- [Java] 백준 2309 - 일곱 난쟁이
- [Java] 백준 1789 - 수들의 합
- [Java] 백준 1987 - 알파벳
- [Node.js] [Rust] 백준 24460 - 특별상이라도 받고 싶어
- [Node.js] 백준 7576 - 탑 보기
- [Rust] 백준 1047 - 울타리 (N^4 브루트포스 + 그리디)
- [Node.js] 백준 9657 - 돌게임3
- [Rust] 백준 4963 - 섬의 개수
- [Node.js] 프로그래머스 - 모의고사 / 실패율
- [Rust] 백준 2667 - 단지번호붙이기
- [Node.js] 프로그래머스 - 방문 길이
- [Node.js] 프로그래머스 - 괄호 회전하기
- [Rust] 백준 1002 - 터렛
- [Node.js] 프로그래머스 - 크레인 인형뽑기 게임
- [Node.js] 프로그래머스 - 기능개발
- [Rust] 백준 13717 - 포켓몬 GO
- [JavaScript] 백준 1092 - 배
- [Rust] 백준 25329 - 학생별 통화 요금 계산
백준 9935 - 문자열 폭발
접근
실패한 접근 : replace를 통해서 계속 돌려보기 - 계속해서 새로운 string을 만드는 구조라 효율적이지 못함.
반복적으로 새로운 문자열을 생성하는 구조 : 시간 초과
정답 접근 스택을 활용하자.
- 입력 문자열을 한 글자씩 스택에 넣음
- 스택의 마지막 부분이 폭발 문자열과 일치하는지 확인
- 일치하면 해당 부분을 pop
- 연쇄작용도 간단히 해결됨
코드
Java
StringBuilder를 스택처럼 활용해서 해결.
찾아보니 해당 요소는 가변적이라 함. (이득)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String exp = br.readLine();
br.close();
StringBuilder res = new StringBuilder();
int expLength = exp.length();
for (int i = 0 ; i < str.length(); i++ ) {
char curChar = str.charAt(i);
res.append(curChar);
if (res.length() >= expLength) {
boolean match = true;
for (int j = 0; j < expLength; j++) {
if (res.charAt(res.length() - expLength + j) != exp.charAt(j)) {
match = false;
break;
}
}
if (match) {
res.setLength(res.length() - expLength);
}
}
}
if (res.length() == 0 ) {
System.out.println("FRULA");
} else {
System.out.println(res);
}
}
}
Node.js
자바와 비슷한 접근 방식.
다만 효율적으로 문자열을 다루기 위해 배열을 스택처럼 사용하고 마지막에 join('')을 통해 해결.
splice와 split의 차이에 대해 자세히 공부할 필요성을 느낌.
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const originalStr = input[0];
const explosionStr = input[1];
const expLen = explosionStr.length;
const resultArr = [];
for (let i = 0; i < originalStr.length; i++) {
const currentChar = originalStr[i];
resultArr.push(currentChar);
if (resultArr.length >= expLen) {
let match = true;
for (let j = 0; j < expLen; j++) {
if (resultArr[resultArr.length - expLen + j] !== explosionStr[j]) {
match = false;
break;
}
}
if (match) {
resultArr.splice(resultArr.length - expLen, expLen);
}
}
}
if (resultArr.length === 0) {
console.log("FRULA");
} else {
console.log(resultArr.join(""));
}
여담
FRULA 는 악기의 이름이라고 한다.
정답이 비어있는 경우 Frula 를 출력하는 이유는
string (문자열, 현) - 아무것도 남지 않으면 (string이 없다면) 관악기라는 말장난이라고 한다.
하하… 하하하…
와중에 첫 예제 입력인
mirkovC4nizCC44
C4
여기도 C4. 하필 폭약이다. 여러 의미로 재밌게 푼 문제.