
● 문제출처
●정리(요약)
X 혹은 Y로 이루어진 문자열 S, E 가 있다.
S 는 제일 뒤에 x를 붙임
S 는 뒤집은 다음 제일 뒤에 Y를 붙인다.
<입력>
테스트 케이스 수 T
x,y로 이루어진 문자열 S가 주어짐
x,y로 이루어진 문자열 E가 주어짐
E는 항상 S길이보다 길다
<출력>
S를 E로 만드는 것이 가능하면 “Yes”를, 아니면 “No”
●코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Solution
{
public static void main(String [] args )throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for(int i = 1; i <= T; i++) {
String S = br.readLine();
String E = br.readLine();
String answer = canTransform(S, E) ? "Yes" : "No";
sb.append("#").append(i).append(" ").append(answer).append("\n");
}
System.out.println(sb.toString());
}
public static boolean canTransform(String S, String E) {
while (E.length() > S.length()) {
if (E.endsWith("X")) {
E = E.substring(0, E.length() - 1);
} else if (E.endsWith("Y")) {
E = new StringBuilder(E.substring(0, E.length() - 1)).reverse().toString();
}
}
return E.equals(S);
}
}
● 실패 코드( 시간 초과 )
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Solution
{
static String S,E;
static boolean isTrue;
public static void main(String [] args )throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for(int i = 1; i<=T;i++) {
S = br.readLine();
E = br.readLine();
isTrue = false;
StoE(S);
String answer="No";
if(isTrue) {
answer="Yes";
}
sb.append("#").append(i).append(" ").append(answer).append("\n");
}
System.out.println(sb.toString());
}
public static void StoE(String str) {
if(str.equals(E)) {
isTrue= true;
return;
}
if(str.length() >= E.length()) {
return;
}
StoE(str + "X");
StoE(new StringBuilder(str).reverse().toString() + "Y");
}
}
●느낀 점
처음은 2번 코드를 하다가 시간 초과....
댓글을 본 후 1번 코드 .endWith("X") ("Y") 를 이용하여 하나씩 지웠다.
가면 갈 수록 정답률이 낮아지네ㅠㅠ