
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [s, t] = fs
.readFileSync(path, 'utf-8')
.trim()
.split('\n')
.map((it) => it.split(''));
while (s.length < t.length) {
if (t.pop() === 'A') continue;
t.reverse();
}
console.log(Number(s.join('') === t.join('')));
⏰ 소요한 시간 : -
이 문제는 S에서 T로 가면 한 단계를 수행할 때마다 지수함수 형태로 값이 커진다.
S의 최소값은 1, T의 최대값은 1,000이니까 이론상 2의 1,000승의 연산을 할 수도 있는 것이다.
따라서 T를 S로 변환하도록 사고한다. 글고 값의 추가, 삭제, 리버스가 용이하도록 배열로 변환해준다.
문자열 T는 이전단계에서 A를 붙였거나, 문자열을 뒤집고 B를 추가한 값이다.
따라서 맨 뒤에서 A를 빼거나, 맨 뒤에서 B를 빼고 문자열을 뒤집으면 이전 단계가 나온다.
첫 예제를 보자!
ABBA 라는 T는 이전단계에 무조건 A를 붙였을 수 밖에 없다. 따라서 A를 빼주면 이전 단계의 S가 나온다.
ABB 라는 T는 이전단계에 무조건 B를 붙이고 뒤집은 값이다. 따라서 B를 빼주고 문자열을 뒤집어준다.
이런식으로 S와 T의 길이가 같아질 때까지 연산한 뒤 두 문자열이 같은지 비교해주면 된다.