SWEA(SW Expert Academy) 20955. XY 문자열 1 D3

heesan·2024년 9월 9일

코딩테스트

목록 보기
16/40

● 문제출처

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&problemLevel=4&contestProbId=AY_gm8_6NjcDFAVF&categoryId=AY_gm8_6NjcDFAVF&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=4&pageSize=10&pageIndex=1

●정리(요약)

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") 를 이용하여 하나씩 지웠다.
가면 갈 수록 정답률이 낮아지네ㅠㅠ

profile
👩‍💻Backend Engineering

0개의 댓글