지구정복

[문자열] 백준 - 무한 문자열 본문

데이터 엔지니어링 정복/Algorithm

[문자열] 백준 - 무한 문자열

nooh._.jl 2021. 7. 20. 11:23
728x90
반응형

https://www.acmicpc.net/problem/12871

 

12871번: 무한 문자열

첫째 줄에 s, 둘째 줄에 t가 주어진다. 두 문자열 s와 t의 길이는 50보다 작거나 같은 자연수이고, 알파벳 소문자로만 이루어져 있다. 

www.acmicpc.net

 

-문제해설

문자열 s와 t를 입력받고 두 문자열을 같은 길이가 될 때까지 문자열을 늘린다음 비교해서 같으면 1 다르면 0을 출력하는 문제이다. 두 문자열의 길이를 같게해야되기 때문에 최소공배수까지 문자열을 늘리면 되는데 파이썬에서는 그냥 서로의 길이만큼 문자열을 곱해서 풀었다. 

자바랑 파이썬 코드 길이 너무 심한거 같다..... 갓 파이썬

 

-자바

package string;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class BJ12871 {
	private static BufferedWriter bw = 
			new BufferedWriter( new OutputStreamWriter(System.out));
	private static String s, t;
	private static int max, lcm;
	private static ArrayList<Integer> so = new ArrayList<Integer>();
	private static StringBuilder sb = new StringBuilder();
	private static StringBuilder tb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		s = br.readLine();
		t = br.readLine();
		sb.append(s);
		tb.append(t);
		
		int a = s.length();
		int b = t.length();
		
		max = Math.max( a, b );
		
		//이따가 최소공배수 구하기 위한 소수구하기
		so.add( 2 );
		for( int i=3; i<=max; i++ ) {
			for( int j=0; j<so.size(); j++ ) {
				if( i%so.get(j)==0 ) break;
				if( j==so.size()-1 && i%so.get(j)!=0 ) so.add(i);
			}
		}
		
		//최소공배수 구하기
		lcm = 1;
		int i = 0;
		while( true ) {
			if( i==so.size()-1 && ( a%so.get(i)!=0 || b%so.get(i)!=0 ) ) {
				lcm *= a*b;
				break;
			}
			if( a%so.get(i)==0 && b%so.get(i)==0 ) {
				lcm *= so.get(i);
				a /= so.get(i);
				b /= so.get(i);
			} else i++;
		}
		
		
		//두 문자열 최소공배수까지 문자열 만들기
		for( int j=0; j<(lcm/s.length())-1; j++ ) sb.append(s);
		for( int j=0; j<(lcm/t.length())-1; j++ ) tb.append(t);
		
		//두 문자열 비교
		if( sb.substring(0, lcm).equals( tb.substring(0, lcm) ) ) bw.write( 1 + "\n" );
		else bw.write( 0 + "\n" );
		
		bw.flush();
		bw.close();
		br.close();
	}
}

 

-파이썬

s = input(); t = input(); print( int( s*len(t) == t*len(s) ) )
728x90
반응형
Comments