본문 바로가기
코딩테스트/자바 Level 0

[Java] 문자열 밀기

by onggury 2023. 7. 18.

문제

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 0 < A 의 길이 = B 의 길이 < 100
  • A, B 는 알파벳 소문자로 이루어져 있습니다.

 

class Solution {
    public int solution(String A, String B) {
        int answer = 0;
        
        int lenA = A.length();
        while(!A.equals(B)) {
            String[] arrA = new String[lenA];
            for(int i = 1; i <= lenA; i++) {
                arrA[i%lenA] = A.substring(i-1, i);
            }
            String strA = String.join("", arrA);
            A = strA;
            // System.out.println(strA);
            answer++;
            if(strA.equals(B)) {
                break;
            }
            else if(answer == lenA) { 
                answer = -1; 
                break;
            }
        }
        // if(lenA/2 < answer) {
        //     answer = lenA - answer;
        // }
        return answer;
    }
}

 

문제를 잘못 이해했다.

문자열을 민다고 정의한 게 "오른쪽으로 한 칸씩 민다" 만 적용되는 것이었다. 왼쪽으로 미는 건 포함되지 않는다.

나는 문자열을 민다는 설명을 "오른쪽으로 한 칸씩 민다" 라는 말로 예시를 들어 설명한 줄 알고 왼쪽으로 미는 생각까지 했었다. 거기에 최소 횟수를 구하라고 하다 보니 왼쪽으로 민 경우, 오른쪽으로 민 경우 중 작은 횟수를 구하라고 단단히 오해를 해버렸다. 오로지 "오른쪽으로 한 칸씩 민다" 만 적용되는 문제였다.

 

오해를 가지고 먼저 오른쪽으로 밀었을 경우를 구현했다. 왼쪽으로 미는 경우는 거의 비슷한 알고리즘을 사용하다 보니 어떻게 해야 할까 고민하던 중, 함수를 만드는 것 말고 좋은 아이디어가 떠올랐다.

오른쪽으로 밀었는데 만약 그 횟수가 "주어진 문자열의 길이의 절반" 보다 크면 그건 무조건 왼쪽으로 미는 방법이 더 횟수가 적다는 의미를 뜻한다. 그래서 "전체 길이 - 오른쪽으로 민 횟수" 를 계산하여 반환하였다. 그러면 왼쪽으로 밀었을 때 횟수가 자연스레 나온다. 하지만 당연히 오른쪽으로 민 횟수만 구하는 문제이니, 다시 주석처리한 후 문제를 해결했다.

 

 

출처

https://school.programmers.co.kr/learn/courses/30/lessons/120921