프로그래머스 JS I 0단계 : 문자열 밀기
신박하다 느껴지는 풀이를 발견하면 남겨둬야 하는 법 (ㅎ).
다행스럽게도 (?) 나만 신박하다 느끼는 건 아닌 듯 하다.
A 문자열에서 마지막 글자를 오른쪽으로 한 칸씩 민다고 할 때 (마지막 글자는 문자열 가장 처음 위치로 간다)
몇 번 밀어야 B 문자열과 같아질까? (result)
라는 문제다.
나는 반복문을 사용해 해결했다.
나의 풀이 ~생각의 흐름~
0. A === B 인지 가장 먼저 확인한다. true일경우 return count (output : 0).
1. A를 배열화 한다.
2. array A의 마지막 글자를 pop() 메서드를 사용해 얻고 삭제한 후, 이를 unshift() 메서드를 사용해 맨 앞자리에 추가해야 한다.
2-2. 이 행위(?)가 반복 되었을 경우 count++를 한다.
3. A.join("")-array A를 string으로- === B 가 되었을 경우 count 를 return 한다.
3-2. !== 일 경우 2, 2-2를 반복한다.
4. 반복문이 종료될 때 까지 !== 일 경우, return -1
의 흐름을 따라 여차저차 풀었다.
완성-제출완료 코드는 이러하다👇
function solution(A, B) {
let arr = [...A];
let count = 0;
for(let i = 0; i < arr.length; i++) {
// 1. 혹시나 이미 같지는 않은지
if(A===B) {
return count;
}
// 2. 같지 않다면 메서드 사용, 반복할 때마다 count++
arr.unshift(arr.pop());
count++;
// 3. 문자 위치 변경 후 문자열로 돌아갔을 때 같다면 그대로 return(끝!)
if(arr.join("") === B) {
return count;
}
}
return -1;
}
그리고 대망의 충격받은 코드 👇
let solution=(a,b)=>(b+b).indexOf(a)
한 줄로 끝난다고 !?
한 가지 위안이라면 많은 분들이 나처럼 놀랐다는 것 (ㅋㅋㅋㅠㅠ)
1. A, B는 a,b자리로 쏙 들어간다.
2. 그 중 B를 두 번 반복한다. (ex. "ohell" > "ohellohell")
3. indexOf() 메서드를 사용해서 반복된 B에 A가 있는지 확인한다.
있다면 이 요소를 찾을 수 있는 가장 첫 번째 인덱스 반환. (놀랍게도!! 이렇게 하면 몇 번 밀렸는지 까지 알 수 있다 ...)
없다면 -1을 반환한다. (indexOf()메서드의 특징)
박수 짝짝짝 ... 👏 👏 👏
정말 수많은 문제 해결 방법이 있고, 그걸 고민하는 게 개발자의 일이구나.
라는 사실을 (정말 새삼스레) 깨달을 수 있었다.
나도 어떤 문제든 여러가지로 고민해봐야지. 아자. 오늘도 파이팅 !