Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

풀이 보관함

[C++] 백준 13019번: A를 B로 본문

problem solving/백준

[C++] 백준 13019번: A를 B로

viin 2023. 2. 28. 20:10

🔗 문제

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

 

13019번: A를 B로

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

www.acmicpc.net

 

🖍 풀이

 

solve() : A와 B의 구성요소 유무로 가능성 확인

  • A와 B의 문자열 길이가 같아야 한다.
  • A와 B를 정렬했을 때 서로 같아야 한다. 같은 문자 구성이라면 정렬했을 때 똑같다!
    • 문자열 길이가 짧아서 정렬해도 시간 초과 없음

 

solve2()

A와 B 문자열을 뒤에서부터 같은지 확인하며 다른 문자열이 나오면 ++result

  • 각 A, B의 뒤를 가르키는 포인터 aptr, bptr를 만들고 서로 같을 때까지 aptr을 왼쪽으로 이동
  • 두 포인터 중 하나라도 문자열 범위를 벗어나면 종료하고 result를 출력한다.

 

먼저 solve()로 구성이 아예 불가능한지 확인한 후, solve2()를 돌려주었다.

 

💾  소스

#include <iostream>
#include <string>
#include <algorithm>

bool solve(std::string A, std::string B) // 일부러 복사 파라미터 사용
{
    if(A.size() != B.size()) // 길이 확인
        return false;
    
    std::sort(A.begin(), A.end());
    std::sort(B.begin(), B.end());
    
    for(int i=0; i<A.size(); ++i) // 문자 구성 확인
    {
        if(A[i] != B[i])
        {
            return false;
        }
    }
    
    return true;
}

int solve2(std::string& A, std::string& B)
{
    int result = 0;
    int aptr, bptr;

    aptr = bptr = A.length()-1;
    
    while(bptr >=0 && aptr >=0)
    {
        if(A[aptr] != B[bptr])
        {
            --aptr;
            ++result;
        }
        else
        {
            --aptr; --bptr;
        }
    }

    return result;
}

int main()
{
    std::string A, B;
    std::cin >> A >> B;
    
    
    std::cout << (solve(A, B) ? solve2(A, B) : -1);
    
    return 0;
}