본문 바로가기
TIL/Programmers

[TIL] 2023.04.08 Programmers_문자열 밀기

by heereal 2023. 4. 8.

Today I Learned

  • Programmers 문제 풀기

 


Programmers 문제 풀기

문자열 밀기

나의 풀이

function solution(A, B) {
    let array = A.split("");
    if ( A === B ) return 0;
    for ( i = 1; i <= A.length; i++ ) {
        let slice = array.slice(0,A.length-1);
        slice.unshift(array[array.length-1]);
        array = slice;
        if ( slice.join("") === B ) return i   
        if ( i === A.length && slice.join("") !== B) return -1
    }
}

일단 문자열 A를 배열로 만든다. 그리고 A의 길이만큼 for문을 돌면서 문자열을 미는 과정을 반복한다. 즉 slice 메서드로 맨 뒤에 한 글자를 제외하고 배열을 자르고, unshift 메서드를 이용해서 이전에 제외한 마지막 글자를 다시 배열의 맨 앞에 추가하는 것이다. 그리고 이 배열을 join 메서드로 다시 문자열로 만든 후에 B와 일치하는지를 판단한다. 그 외에 if문으로 for문이 종료되는 조건이나 예외 처리를 해주었다.

 

처음에는 배열을 자르는 데 splice 메서드를 사용했었는데 원본 배열까지 수정하는 속성 때문에 기존 배열의 마지막 한 글자를 찾을 수 없었다. 그래서 splice 메서드 대신 slice 메서드를 쓰는 것으로 풀이를 변경했다.

 

 

slice()와 splice()의 차이점

  • slice() 메서드는 begin부터 end 전까지의 복사본을 새로운 배열 객체로 반환한다. 즉, 원본 배열은 수정되지 않는다.
  • splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경한다. 이 메서드는 원본 배열 자체를 수정한다.

출처 https://im-developer.tistory.com/103

 

 

다른 사람의 풀이 01

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

문자열 b와 b를 더한 후에 indexOf 메서드로 a가 있는지를 탐색한다. indexOf()는일치하는 값이 없을 때 -1을 반환하는 속성을 가지고 있기 때문에 문자열 밀기가 불가능한 경우를 예외 처리해 줄 필요도 없다!

 

 

다른 사람의 풀이 02

function solution(A, B) {
    if (A===B) return 0;
    for (let i = 0; i < A.length; i++) {
        A = A.slice(-1) + A.slice(0,-1);
        if (A === B) return i+1;
    }
    return -1;
}

나랑 비슷한 풀이 방법인데 좀 더 간결하게 풀었다. 내 풀이와 가장 다른 부분은 문자열을 배열로 만드는 과정이 삭제되었다는 점이다. 이렇게 풀면 기존 문자열을 배열로 만들고 ushift 메서드를 사용하거나, join 메서드를 이용해서 배열을 문자열로 다시 변환하는 과정이 사라진다. 기존 문자열 차제를 slice한 다음에 + 해서 합치는 방법으로 간단하게 풀 수 있다.

 

 

 

댓글