본문 바로가기
CodingTest/Programmers

[프로그래머스] Lv0 문자열 밀기***

by yoondoo 2023. 2. 7.
728x90

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


제한사항

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

입출력 예

"hello" "ohell" 1
"apple" "elppa" -1
"atat" "tata" 1
"abc" "abc" 0

 

입출력 예 #1

  • "hello"를 오른쪽으로 한 칸 밀면 "ohell"가 됩니다.

입출력 예 #2

  • "apple"은 몇 번을 밀어도 "elppa"가 될 수 없습니다.

입출력 예 #3

  • "atat"는 오른쪽으로 한 칸, 세 칸을 밀면 "tata"가 되므로 최소 횟수인 1을 반환합니다.

입출력 예 #4

  • "abc"는 밀지 않아도 "abc"이므로 0을 반환합니다.
class Solution {
    public int solution(String A, String B) {
        int answer = -1;
        int cnt = 0;
        
        if(A.equals(B)) return answer=0;
        
        StringBuilder sb = new StringBuilder(A);
        
        for(int i=0; i<A.length(); i++) {
        	char last = sb.charAt(sb.length()-1);
        	String res = sb.substring(0, sb.length()-1);
        	String compareStr = last+res;
        	cnt++;
        	if(compareStr.equals(B)) {
        		answer = cnt;
        		break;
        	}
        	sb = new StringBuilder(compareStr);
        }
        
        return answer;
    }
}

문제 그대로 마지막 문자는 앞으로 가져오고 마지막 문자를 제외한 나머지 문자들을 잘라서 합친 다음 매개변수 B와 비교해서 cnt를 반환해주는 식으로 구현했다.

 

그런데 신기하고 기발한? 코드가 있어서 가져와봤다.

class Solution {
    public int solution(String A, String B) {
        String tempB = B.repeat(3);
        return tempB.indexOf(A);
    }
}


class Solution {
    public int solution(String A, String B) {

        return (B+B).indexOf(A);
    }
}

두 개 코드는 결국 B를 2번 반복해서 붙여 넣고 (한 칸씩 밀고 마지막 문자를 앞으로 끌어왔기 때문에 만약 A가 B가 될 수 있다면 target문자열끼리 1번 합친 물자열의 index번째에 있는 것이다) 그 안에서 indexOf()의 반환값을 이용해 있으면 해당 인덱스 번호를 반환 없으면 -1을 바꾸지 않아도 되면 0을 리턴해줬다.

 

A가 B가 될 수 있다는 상황을 가정하고 '머리 - 몸통 - 꼬리'의 개념으로 생각해보면
A는 '머리 - 몸통 - 꼬리'

B는 꼬리를 때서 머리 앞에 붙히고 나머지는 한 칸씩 밀면 '꼬리 - 머리 - 몸통' 일 것이다.

B를 1번만 이어 붙혀도 '꼬리 - 머리 - 몸통 - 꼬리 - 머리 - 몸통' 여기서 A인 '머리-꼬리-몸통'을 찾아보면 1번째 인덱스에 있는 것을 알 수 있다.

 

A가 '머리1 - 머리2 - 몸통1 - 몸통2 - 몸통3 - 꼬리1- 꼬리2'

B가 '몸통2- 몸통3 - 꼬리1 - 꼬리2 - 머리1 - 머리2 - 몸통1' 이라고 해보면
'몸통2 - 몸통3 - 꼬리1 - 꼬리2 - 머리1 - 머리2 - 몸통1 - 몸통2- 몸통3 - 꼬리1 - 꼬리2 - 머리1 - 머리2 - 몸통1'
위에서 A를 찾으면 4번째 인덱스에 있는 것을 알 수 있다.

 

정리를 하면서 내가 이해한게 맞나? 의심되었는데 문제에서 보면 결국 A가 B가 될 수 없으면 -1을 반환하면 되기 때문에 되면 인덱스를 안되면 -1을 바꾸지 않아도 되면 0을 반환하면 되기 때문에 너무 딥하게 빠지지 않아도 될 것 같다.

반응형

댓글