문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다.
이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
| A | B | result |
|---|---|---|
| "hello" | "ohell" | 1 |
| "apple" | "elppa" | -1 |
| "atat" | "tata" | 1 |
| "abc" | "abc" | 0 |
function solution(A, B) {
// 먼저 A를 오른쪽으로 한 칸씩 밀어서 어떤 문자열을 만들 수 있는지를 검사하고, 그 결과가 B와 일치하는지를 확인
// 만약 가능하다면, 밀어야 하는 최소 횟수를 반환하고, 불가능하다면 -1을 반환
if (A === B) {
return 0;
}
let answer = -1;
const len = A.length - 1;
for (let i = 1; i <= len; i++) {
const shiftedA = A.slice(-i) + A.slice(0, A.length - i)
if (shiftedA === B) {
return answer = i;
break
}
}
return answer;
}
로직 설명
A와 B가 같다면 바로 0을 return하고, 아니라면 A의 끝에서 첫번째 글자를 맨 앞에 두고
나머지를 뒤에 붙여서 B와 비교한 뒤 둘이 같다면 민 횟수와 같은 i를 answer에 담아 return.
let solution=(a,b)=>(b+b).indexOf(a)
아니 이렇게 간단한 방법이 있었다고?
아니 그런 방법이 있었다 해도 이걸 생각해낸다고?
b와 b를 더해서 만들어지는 문자열이 A의 각 문자를 오른쪽으로 밀고 가장 끝 문자를 처음으로 옮긴
문자가 만들어진다면 indexOf로 1이 나오게 되고
같으면 인덱스가 0이니까 딱 되네요..
불가능 하면 indexOf에 의해 -1이 나올테니 (false) 한 줄로 끝나는 풀이가 있었습니다..
이걸 이렇게 쉽게 풀다니