문제 설명
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 몇 번 밀어야 하는지 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 < A의 길이 = B의 길이 < 100
A, B는 알파벳 소문자로 이루어져 있습니다.
입출력 예
A B result
"hello" "ohell" 1
"apple" "elppa" -1
(길고 장황한)나의 코드
function solution(A, B) {
const array = A.split("");
let counter = 1;
for (let i = 0; i < array.length; i++) {
let first = array.pop();
let Array = [first, ...array];
if (A === B) {
return (counter = 0);
} else if (Array.join("") === B) {
return counter;
} else {
array.unshift(first);
counter++;
}
}
return (counter = counter > A.length ? -1 : counter);
}
자스민 특: 모르겠으면 일단 for문 돌리고 봄.
A가 hello, B가 ohell이라고 해보자.
(뒤죽박죽한) for문을 시작하자마자 일단 hello의 뒷글자를 떼서 first 변수에 담는다. (첫글자로 들어갈 예정이라 변수명을 first로 지음. 별론가?)
array는 이미 pop을 당해버려 h,e,l,l이 되어버렸으므로, 스프레드 연산자를 이용해 first를 앞에 붙여준다.
그럼 가까스로 o,h,e,l,l 완성.
o,h,e,l,l의 join인 ohell이 B와 같다면 for문 시작할 때 정의해 놓은 counter = 1을 반환하고 함수 끝!
만약 A와 B가 같다면 0을 리턴,
아무리 밀어도 B가 안나온다면 counter++을 A의 길이보다 1번 더하게 된다.
따라서 A의 길이보다 counter가 더 길면 -1을 리턴.
어휴 겨우 다짰네 뿌듯 ^^
할 순간도 잠시
1줄 짜리 코드 발견 (ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)
미춌다 ㅋㅋㅋㅋㅋㅋ
let solution = (a, b) => (b + b).indexOf(a);
b+b는 ohellohell이 되므로, hello를 처음 발견하게 되는 index는 1번이므로 1을 반환.
그럼 만약 a=apple, b= elppa라면?
b+b=elppaelppa
인데 어떻게 -1을 반환하지?
MDN설명을 보니
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
Array.prototype.indexOf()
indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하고 존재하지 않으면 -1을 반환합니다.
네.. 알겠습니다...
여튼 오늘도 상상도 못한 정체!