[코딩테스트] 문자열 밀기

windowook·2024년 1월 5일
post-thumbnail

🌱 문자열 밀기

문제

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

ABresult
"hello""ohell"1
"apple""elppa"-1
"atat""tata"1
"abc""abc"0

⛔ 제한사항

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

나의 풀이

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.

다른 사람의 풀이 Best

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

아니 이렇게 간단한 방법이 있었다고?
아니 그런 방법이 있었다 해도 이걸 생각해낸다고?

b와 b를 더해서 만들어지는 문자열이 A의 각 문자를 오른쪽으로 밀고 가장 끝 문자를 처음으로 옮긴
문자가 만들어진다면 indexOf로 1이 나오게 되고

  • ohell + ohell = ohellohell

같으면 인덱스가 0이니까 딱 되네요..
불가능 하면 indexOf에 의해 -1이 나올테니 (false) 한 줄로 끝나는 풀이가 있었습니다..
이걸 이렇게 쉽게 풀다니

profile
안녕하세요

0개의 댓글