학습(0)/C++ 문제풀이

뮨자열 밀기

누가 뭐래도 개발자 2025. 3. 18. 19:08

오른쪽이든 왼쪽이든 밀어서 더 조금 이동하는 이동 칸수 반환 문제.

 

int solution(string A, string B) {
    int answer = -1;// min(l, r)
    int lMove = 100, rMove = 100;
    int size = A.size();

    if (A == B)
        return 0;

    for (int i = 1; i < size; ++i)//칸 이동
    {
        string tmp = "";  //오른쪽 실수로 좌우 반전 됨.
        int j = i;

        string tmp2 = ""; //왼쪽
        int k = size - i;

        int loop = 0;

        while(loop++ < size)
        {
            tmp  += A[j++ % size]; 
            tmp2 += A[k++ % size];
        }

        if (tmp == B)
            rMove = i;

        if (tmp2 == B)
        {
            lMove = i;
            break;
        }
    }

    if(lMove != 100 || rMove != 100)
        answer = min(rMove, lMove);

    return answer;
}

 

한 문제를 통과 못한다.

 

  • 디버깅

 

왼쪽(실수로 좌우 반전) 이동 성공 후에도 오른 쪽이 통과 될때까지 break 되지않고 추가가 되는건 아닐까 싶어 테스트 해본다.

왼쪽으로 한 칸 이동하면 맞출 수 있는 solution("hello", "elloh"); 를 넣어보았다.

-> 오른 쪽이 새로 덮어지기 전에 반복문이 종료되어 min값을 제대로 넣는다 -> 1.

그러나, 비효율이 있기에 왼쪽 찾으면 바로 break 하도록 수정.

 

이건 나도 해봤지만, 왼쪽 1칸이 맞지 않나?

 

쓰벌 오른 쪽만 하는 거였음.

적은칸 얘기는 왜  나온겨.

 

 

아, 이런 문제 겪었었는데 잊고있었어.

기억하자. 문자열 미는 건, 두개 이어 붙히면 돼.

int solution(string A, string B)
{
    B += B;
    return B.find(A);
}

'학습(0) > C++ 문제풀이' 카테고리의 다른 글

연속된 수의 합, 등차 수열 응용  (0) 2025.03.19
다음에 올 숫자, 등차/ 등비 수열  (0) 2025.03.18
유한소수 판별  (0) 2025.03.18
옹알이1  (0) 2025.03.18
등수 매기  (0) 2025.03.18