문자열 밀기

HS K·2023년 2월 5일
0
post-custom-banner

문제설명

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

내가 쓴 답

function solution(A, B) {
    let k = Array.from(A)
    k.push(k.shift())
    let result = k.join("")
    if(result === B) {
       return 1
       }
    else return -1
}

※ 참고로 틀린 답이다. 어디가 틀렸을까?

  • 문제조차 잘못 이해했다. shift()를 이용해서 첫번째 요소를 제거해서 뒤에 붙이는게 아니라, 맨 마지막 요소를 제거하고 앞에 붙이는 것이다.

수정한 답 (ChatGPT 참고)

function solution(A, B) {

    let count = 0;
    while (A !== B) {
        let k = Array.from(A)
        k.unshift(k.pop())
        A = k.join('')
        count++;
        if (count > A.length) return -1;
    }
    return count;
}

해설

while문을 사용하여 A 문자열을 오른쪽으로 한 칸씩 밀어서 B 문자열을 만들어내는 과정을 반복한다. A 문자열이 B 문자열이 될 때까지 반복하며, 이 때마다 count 변수를 증가시켜 A 문자열을 밀어낸 횟수를 계산한다.

let count = 0은 반복문에서 A 문자열을 이동시킨 횟수를 저장하기 위한 변수이다. 초기값을 0으로 설정하여 반복문에서 A 문자열을 이동시키면서 이동한 횟수를 1씩 증가시킨다.
이동한 횟수를 저장해두면 최종적으로 A를 B로 이동시키기 위해 필요한 최소한의 이동 횟수를 알 수 있다.
따라서 let count = 0을 사용하여 변수를 초기화하고, 반복문에서 이동한 횟수를 1씩 증가시켜 저장한다.

let count = 0 은 다른 문제풀때 초기화하는 방법으로 쓰이니 알고있자.

만약 A 문자열을 한 바퀴 이상 돌려도 B 문자열이 되지 않으면, A를 밀어서 B가 될 수 없기 때문에 -1을 리턴한다. 마지막으로 count 변수를 리턴하여 A를 밀어낸 최소 횟수를 반환한다.

여러종류의 풀이 보기

1번

let solution=(a,b)=>(b+b).indexOf(a)

이게뭐지..?

2번

function solution(A, B) {
    var answer = 0;
    const a = A.split("")
    const b = B.split("")
    while(a.join("") != b.join("")){
        a.unshift(a[a.length-1])
        a.pop()
        answer += 1
        if(answer == a.length) break
    }
    return answer === a.length ? -1 : answer;
    // return a
}

3번

function solution(_A, _B) {
    const N = _A.length;

    const A = _A.split("");
    const B = _B.split("");

    let i = 0;

    while (i < N && A.join("") !== B.join("")) {
        A.unshift(A.pop());
        i += 1;
    }

    return A.join("") === B.join("") ? i : -1;
}

4번

const solution=(A, B)=>{
    if(A===B) return 0;
    let stack = B.split('');
    let count = 0;
    for(let i=1;i<=stack.length;i++){
        stack.push(stack.shift());
        if(stack.join('')===A){
            count = i;
            break;
        }
    };
    return count || -1;
}

후기

  1. 처음 코드를 짤때 while문을 if문과 같은 원리라고 착각했었다.
  2. shift()와 push()함수를 섞어쓸때 어떻게 써야할지 익힐 수 있었다. (unshift()와 pop()도 위와 원리가 같다)
function solution(A) {
    let k = Array.from(A)
    k.shift()
    k.push()
    return k
}
console.log(solution(A))
//e,s,t

function solution(A) {
    let k = Array.from(A)
    k.shift()
    k.push(k.shift())
    return k
}
console.log(solution(A))
//s,t,e
  1. 어떻게 while문을 이용하여 반복적으로 옮길 수 있을지 고민을 많이했다.

  2. 자꾸 배열에만 집착하고 있었다. A와 B는 문자열이라는 조건을 간과하게 된다.

P.S ChatGPT를 이용하여 내가 어디서 막혔는지 빠르게 점검할 수 있었다.

profile
주의사항 : 최대한 정확하게 작성하려고 하지만, 틀릴내용이 있을 수도 있으니 유의!
post-custom-banner

0개의 댓글