프로그래머스 문자열 밀기

0

알고리즘

목록 보기
4/8
post-thumbnail

혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다.

문제 설명

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

풀이한 코드

1차 시도(실패)

A의 첫번째 값과 B에서 인덱스 추출한 값을 차례대로 비교했다. 하지만 이 경우에 첫번째 값이 B에서 여러번 사용되는 경우에는 올바른 값을 추출하기 어렵다.
즉, B.indexOf(A[0]), B.lastIndexOf(A[0]) 가 다를 경우에 문제가 발생한다.

function solution(A, B) {
  //     입력: 문자열
  //     출력: 숫자

  //     A 첫번째 기준으로 B에 일치하는 인덱스 추출 
  //		-> 인덱스 다음 자리값 비교(인덱스 차이 => 리턴값 추론)
  // 	 반복문으로 차례대로 값이 일치하는지 비교한다.
  // 		(a인덱스+차이)%길이 ->b의 인덱스 값
  
    let gap = B.indexOf(A[0]);
    const length = A.length;
    
    for(let i = 1; i<length; i++ ){
            const char = A[i];
            if(char !== B[(gap+i)%length]){
                gap = -1;
                break;
             }
         }
    return gap;   
}

2차 시도(통과)

function solution(A, B) {
    // result에 -1을 할당한다.
    // a를 한자리씩 이동한 문자열을 생성하는 콜백함수를 정의한다.
        // 입력값: 이동한 값.
        // 반환값: 새로 정의한 문자열
    // 반복문으로 A의 길이만큼 한글자씩 이동한 결과값이 B와 일치하는 i의 값을 result 변수에 할당한다.
    let result = -1;
    const stringPusher = (num)=>A.slice(-num)+A.slice(0,-num)
    for(let i = 0; i< A.length; i++){
        const newString = stringPusher(i);
        newString === B ? result=i: null;
    }
    return result;
}

좋은 레퍼런스

A 문자열 자체를 검색할 수 있는 좋은 방법이었다.

function solution(A, B){
	return (B+B).indexOf(A)
}

0개의 댓글