같은 칸 수만큼 민 암호인지 확인하기

자바스크립트 코딩테스트 문제로 cyclic-shift-check 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.

today easy cyclic-shift-check 함수명: isUniformAlphabetShift 제한 시간: 200ms

문제 설명

두 문자열 sourcetarget이 주어집니다.

source의 모든 글자를 같은 칸 수만큼 앞으로 밀어서 target을 만들 수 있으면 true, 아니면 false를 반환하는 isUniformAlphabetShift 함수를 작성하세요.

알파벳은 원형처럼 이어집니다. 즉, Z를 한 칸 밀면 A가 됩니다.

예를 들어 "ABC"를 3칸 밀면 "DEF"가 되므로 true입니다. "AZ"를 1칸 밀면 "BA"가 되므로 이것도 true입니다.

제한사항

  • sourcetarget의 길이는 서로 같습니다.
  • 각 문자열의 길이는 0 이상 100,000 이하입니다.
  • 문자열은 영문 대문자로만 이루어집니다.
  • 모든 글자를 각각 다른 칸 수로 미는 것이 아니라, 한 번 정한 이동 칸 수를 전체 문자열에 똑같이 적용해야 합니다.
  • 반환값은 조건을 만족하면 true, 아니면 false입니다.

예시

  • 입력: source = "ABC", target = "DEF" → 출력: true
  • 입력: source = "AZ", target = "BA" → 출력: true
  • 입력: source = "CAT", target = "DOG" → 출력: false
  • 입력: source = "", target = "" → 출력: true

힌트

  • 첫 번째 문자에서 몇 칸 이동했는지 먼저 구해 보세요.
  • 그 뒤 나머지 문자들도 같은 이동 칸 수를 가지는지만 확인하면 됩니다.
  • Z 다음이 A가 되므로 나머지 연산을 이용하면 편합니다.

해설

이 문제의 핵심은 모든 위치에서 알파벳 이동량이 같아야 한다는 점입니다.

  1. 두 문자열이 모두 빈 문자열이면 이동 규칙을 어기지 않았으므로 true입니다.
  2. 첫 글자 source[0]target[0] 사이의 이동 칸 수를 구합니다.
  3. 문자열을 왼쪽부터 끝까지 순회합니다.
  4. 각 위치마다 (target의 알파벳 번호 - source의 알파벳 번호 + 26) % 26을 계산합니다.
  5. 이 값이 처음 구한 이동 칸 수와 한 번이라도 다르면 false를 반환합니다.
  6. 끝까지 모두 같으면 true를 반환합니다.

예를 들어 source = "AZ", target = "BA"이면:

  • A -> B 는 1칸 이동
  • Z -> A 도 원형으로 보면 1칸 이동

따라서 전체 문자열이 같은 칸 수만큼 밀린 경우이므로 true입니다.

반면 source = "CAT", target = "DOG"이면:

  • C -> D 는 1칸
  • A -> O 는 14칸

이동량이 서로 다르므로 false입니다.

이 방식은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이고, 추가 공간은 O(1)입니다.

코드 작성

starter code를 바탕으로 함수를 완성한 뒤 예제 테스트를 실행해보세요.

JavaScript 에디터 로딩 중...

커스텀 테스트

함수 인자를 JSON 배열 형태로 입력하세요. 예: [3, 5], [[1, 2, 3]]

아직 실행하지 않았습니다.

실행 결과

아직 실행하지 않았습니다.

예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.

댓글

문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.