알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][13019] A를 B로

kim.svadoz 2021. 5. 24. 17:32
반응형

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

 

13019번: A를 B로

첫째 줄에 A, 둘째 줄에 B가 주어진다. 두 문자열의 길이는 같으며, 길이는 50을 넘지 않는다. 또, 알파벳 대문자로만 이루어져 있다.

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 512 MB 189 67 51 40.476%

문제

문자열 A와 B가 주어진다. 한 번 문자열을 바꾸는 것은 A의 한 글자를 골라서 문자열의 가장 처음으로 옮기는 것을 의미한다.

A를 B로 바꾸기 위해서 문자열을 바꿔야 하는 횟수의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A, 둘째 줄에 B가 주어진다. 두 문자열의 길이는 같으며, 길이는 50을 넘지 않는다. 또, 알파벳 대문자로만 이루어져 있다.

출력

첫째 줄에 A를 B로 바꾸는 연산 횟수의 최솟값을 출력한다. A를 B로 바꿀 수 없을 때는 -1을 출력한다.

예제 입력 1

ABC
CBA

예제 출력 1

2

예제 입력 2

A
B

예제 출력 2

-1

예제 입력 3

AAABBB
BBBAAA

예제 출력 3

3

예제 입력 4

A
A

예제 출력 4

0

예제 입력 5

DCABA
DACBA

예제 출력 5

2

코드

/*
    A를 B로
    Greedy + 구현
    str1의 맨 뒤에서부터 한글자 씩 str2의 맨 앞에서부터 차례차례 탐색한다.
*/
import java.io.*;
public class p13019 {
    static String str1, str2;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        str1 = br.readLine();
        str2 = br.readLine();
        int[] arr1 = new int[26];
        int[] arr2 = new int[26];
        int size = str1.length(), cnt = 0;
        for (int i = 0; i < size; i++) {
            arr1[str1.charAt(i) - 'A']++;
            arr2[str2.charAt(i) - 'A']++;
        }


        for (int i = size - 1; i >= 0; i--) {
            if (str1.charAt(i) == str2.charAt(size - 1 - cnt)) {
                cnt++;
            }
        }
        boolean flag = false;
        for (int i = 0; i < 26; i++) {
            if (arr1[i] != arr2[i]) {
                flag = true;
                break;
            }
        }
        System.out.println(flag ? -1 : size - cnt);

    }
}
반응형