문자열 "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을 반환하면 되기 때문에 너무 딥하게 빠지지 않아도 될 것 같다.
'CodingTest > Programmers' 카테고리의 다른 글
| [프로그래머스] Lv0 배열의 길이에 따라 다른 연산하기 (0) | 2024.10.31 |
|---|---|
| [프로그래머스] Lv.0 문자 리스트를 문자열로 변환하기 (1) | 2023.07.12 |
| [프로그래머스] Lv0 치킨 쿠폰 (0) | 2023.02.06 |
| [프로그래머스] Lv0 로그인 성공? (1) | 2023.02.02 |
| [프로그래머스] Lv0 직사각형 넓이 구하기 (0) | 2023.02.02 |
댓글