본문 바로가기
Java

Java 회전된 문자열인지 확인하기

by 완기 2022. 1. 30.
728x90
반응형

회전된 문자열은 string이란 문자열이 있을 때,

 

string이란 문자열의 요소를 회전시켰을 때,

ingstr

 다음과 같은 문자열을 만들 수 있냐? 이런 문제다.

 

위 ingstr은 str이 우측으로 가면 되기 때문에 만들 수 있는 문자열이다.

이 처럼 특정 값을 회전시켰을 때, 값을 만들 수 있는지 판별하는 코드이다.

 

public class Main {
    public static void main(String[] args) {
        String s = "string"; //원본 문자열
        String cycled = "ingstr"; //타겟 문자열

        System.out.println(isCycled(s, cycled));
    }

    public static boolean isCycled(String origin, String target) {
        return origin.length() == target.length() && target.repeat(2).contains(origin);
    }
}
300x250

코드는 상당히 간단하다.

두 문자열의 문자열 길이가 같고, 바뀐 문자열을 2번 더한 값에 원래 문자열이 포함된 지 보면 된다.

 

ingstringstr

 

이 처럼, 두 번 더하면 원래 문자열이 포함된다.

 

또 한가지의 예시로 배열을 회전시켰을 때도 마찬가지다.

 

int[] origin = {2, 4, 5, 9, 10}; //원본
int[] target = {5, 9, 10, 2, 4}; //회전

위처럼 회전된 배열이 있을 때,

 

나는 toString으로 비교했다.

 

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] origin = {2, 4, 5, 9, 10}; //원본
        int[] target = {5, 9, 10, 2, 4}; //회전

        System.out.println(isCycled(origin, target));
    }

    public static boolean isCycled(int[] origin, int[] target) {
        String originValue = Arrays.toString(origin).replaceAll(" ", "");
        String targetValue = Arrays.toString(target).replaceAll(" ", "");
        String originToString = originValue.substring(1, originValue.length() - 1);
        String targetToString = targetValue.substring(1, targetValue.length() - 1) + "," + targetValue.substring(1, targetValue.length() - 1);

        System.out.println("originValue = " + originValue);
        System.out.println("targetValue = " + targetValue);

        System.out.println("to String original = " + originToString);
        System.out.println("to String targetToString = " + targetToString);

        return origin.length == target.length && targetToString.contains(originToString);
    }
}

결과

 

정규 표현식을 사용하면 더 간결하게 풀 수 있다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] origin = {2, 4, 5, 9, 10}; //원본
        int[] target = {5, 9, 10, 2, 4}; //회전

        System.out.println(isCycled(origin, target));
    }

    public static boolean isCycled(int[] origin, int[] target) {
        String originValue = Arrays.toString(origin).replaceAll("[\\[\\]\\s]", "");
        String targetValue = Arrays.toString(target).replaceAll("[\\[\\]\\s]", "") + "," + Arrays.toString(target).replaceAll("[\\[\\]\\s]", "");
        System.out.println("originValue = " + originValue);
        System.out.println("targetValue = " + targetValue);
        return origin.length == target.length && targetValue.contains(originValue);
    }
}
728x90
728x90

댓글