문제풀이

프로그래머스 JS I 0단계 : 문자열 밀기

HYEMBURGER 2022. 12. 18. 15:25

 

 

 

신박하다 느껴지는 풀이를 발견하면 남겨둬야 하는 법 (ㅎ).

다행스럽게도 (?) 나만 신박하다 느끼는 건 아닌 듯 하다. 

 

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()메서드의 특징)

 

박수 짝짝짝 ... 👏 👏 👏 

정말 수많은 문제 해결 방법이 있고, 그걸 고민하는 게 개발자의 일이구나.

라는 사실을 (정말 새삼스레) 깨달을 수 있었다. 

나도 어떤 문제든 여러가지로 고민해봐야지. 아자. 오늘도 파이팅 !