프로그래머스 0단계 - 문자열 밀기

이종현·2024년 1월 16일
0

코딩테스트

목록 보기
17/24
post-thumbnail

문제 설명

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


제한사항

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

입출력 예

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

1. 문제 이해

  • A문자를 밀어서 B가 되는 최소 횟수를 return하거나, 그게 안되면 -1, 완전히 똑같으면 0을 리턴한다.
  • input은 A도 B도 10^2 이기 때문에 시간복잡도는 문제 없어 보인다.

2. 접근 방법

  • 직관적으로 생각하기
    • 일단 문자열을 비교해서 동일하면 0을 리턴한다.
    • 비교해서 동일하지 않으면, 정렬해서 동일한지 파악하고, 정렬해서 동일하지 않으면 -1을 리턴한다.
    • 비교해서 동일하지 않고, 정렬해서 동일하면 몇 번 문자열을 밀어야 될지를 구한다.
      • 문자열을 배열로 변환하고 배열에서 마지막 원소를 temp 변수에 담고 마지막 원소를 pop한다.
      • temp 변수를 가장 배열의 가장 첫 번째 원소에 넣고 다시 문자열로 변환한 뒤, 기존 문자열과 비교한다.
      • 해당 과정을 문자열의 길이만큼 반복한다.
      • 이때 밀어서 가능하면 1이고 가능하지 않으면 -1을 리턴한다.

3. 코드 설계

  • 직관적으로 생각하기
    • if(a === b) return 0
    • if([…a].sort() !== […b].sort()) return -1
    • else
    • for(let i = 0; i < a.length; i++)
    • const aArr = [..a]
    • const pushArr = […aArr]
    • const temp = pushArr[pushArr.length - 1]
    • pushArr.pop()
    • pushArr.unshift(temp)
    • const pushString = pushArr.join()
    • if(pushString === a) return 1
    • else return -1

4. 코드 구현

function solution(A, B) {
  if (A === B) return 0
  if ([...A].sort().join('') !== [...B].sort().join('')) return -1

  let aArr = [...A]

  for (let i = 1; i <= A.length; i++) {
    const pushArr = [...aArr]
    const temp = pushArr[pushArr.length - 1]
    pushArr.pop()
    pushArr.unshift(temp)
    const pushString = pushArr.join('')
    aArr = pushArr
    if (pushString === B) return i
  }

  return -1
}

다른 사람 풀이

let solution = (a, b) => (b + b).indexOf(a)
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
}

회고

실제 위에 코드 설계한 부분이랑 코드 구현 부분을 같이 보면, 처음에 머릿속으로만 생각해서 코드를 설계했을때와 실제 구현했을때의 차이점이 분명하게 존재한다. 아무래도 코드 설계하는 부분은 아직 많이 안해봐서 그런건지, 아니면 그냥 생각하는 힘이 부족해서 그런건지 코드 구현하는 부분과 틀리는 경우가 많이 있는 것 같다. 이 부분의 간극을 조금씩 좁혀나가다보면 생각하는 힘도 길러질거고 코드 구현하는 시간도 단축시킬 수 있을 것 같다.

profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글