본문 바로가기
코딩 테스트 연습/프로그래머스 level 0

[프로그래머스] lv0. 문자열 밀기 (JS)

by 카누가 좋아요 2023. 6. 24.

❓ 문제

코딩테스트 연습 - 문자열 밀기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡 해결하기

1️⃣ 문자열을 민다는 것에 대한 의미 파악

입출력 예시 중 첫번째를 보면 'hello' 라는 문자열에서 각 문자를 오른쪽으로 한칸씩 밀고 마지막 문자는 맨 앞으로 이동시켜 'ohell' 이라는 문자를 만들고, 이때 밀어야 하는 최소 횟수가 1이라고 하고 있다.

각 문자를 한칸씩 밀어야 한다고 해서 진짜로 각각의 문자에 대하여 어떠한 조작을 해야 한다고 생각하지 말고, 결국에는 맨 끝의 문자가 맨 앞에 위치하게 되면 그것이 각 문자를 오른쪽으로 한칸씩 민 형태가 되므로 이를 이용하면 된다.

 

2️⃣ 사용해야 할 메서드

인자로 들어가는 A 문자열을 맨 끝 문자와 나머지 문자로 각각 잘라내어 맨 끝 문자를 앞에 위치시키고 그 뒤에 나머지 문자를 붙이면(더하면) 된다.

이는 substring 메서드를 이용하면 가능하다.

 

* str.substring(i, j) 의 형식으로 작성하면 str의 i번째부터 j번째까지의 문자로 이루어진 문자열을 잘라낼 수 있다.

* str.substring(i) 의 형식으로 작성하면 str의 i번째부터 끝까지의 문자로 이루어진 문자열을 잘라낼 수 있다.

 

3️⃣ 전체적인 설계

위 과정을 통해 계속 A 문자열을 업데이트 해나가면서 B와 같아질 때까지만 반복하면 된다.

B와 같아지는 순간이 오면 그때까지 문자열을 민 횟수를 반환하면 된다.

만약 A 문자열이 처음 상태로 돌아갈 때까지(A의 길이만큼 반복할 때까지) B와 같아지지 못한다면 문자열을 오른쪽으로 한칸씩 밀어 B처럼 만드는 것이 불가능해지는 것이므로 -1을 반환하면 된다.

 

 

 

💻 JS로 코드 작성해보기

 

function solution(A, B) {
  for (let times = 0; times < A.length; times++) {
    if (A === B) {
      return times; // 문자열을 밀지 전, 같으면 문자열을 민 times 반환
    }
    A = A.substring(A.length - 1) + A.substring(0, A.length - 1); // 문자열 밀기
  }
  return -1;
}

 

➕ 다른 사람의 코드

창의적인? 코드가 있어서 가져와 봤다.

 

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

 

입출력 예시에서 3번째 예시인 'atat'로 분석해 보자.

우선, a는 'atat'에, b는 'tata'에 해당한다.

(b + b).indexOf(a)를 실행하면 ('tata' + 'tata').indexOf('atat') ➡️ ('tatatata').indexOf('atat') ➡️ 1 이 된다.

'tatatata'에서 'atat'가 처음 등장하는 부분은 1번 인덱스부터 4번 인덱스까지이므로 1이 반환된다.

댓글