같은 칸 수만큼 민 암호인지 확인하기
자바스크립트 코딩테스트 문제로 cyclic-shift-check 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.
문제 설명
두 문자열 source와 target이 주어집니다.
source의 모든 글자를 같은 칸 수만큼 앞으로 밀어서 target을 만들 수 있으면 true, 아니면 false를 반환하는 isUniformAlphabetShift 함수를 작성하세요.
알파벳은 원형처럼 이어집니다. 즉, Z를 한 칸 밀면 A가 됩니다.
예를 들어 "ABC"를 3칸 밀면 "DEF"가 되므로 true입니다. "AZ"를 1칸 밀면 "BA"가 되므로 이것도 true입니다.
제한사항
source와target의 길이는 서로 같습니다.- 각 문자열의 길이는
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가 되므로 나머지 연산을 이용하면 편합니다.
해설
이 문제의 핵심은 모든 위치에서 알파벳 이동량이 같아야 한다는 점입니다.
- 두 문자열이 모두 빈 문자열이면 이동 규칙을 어기지 않았으므로
true입니다. - 첫 글자
source[0]와target[0]사이의 이동 칸 수를 구합니다. - 문자열을 왼쪽부터 끝까지 순회합니다.
- 각 위치마다
(target의 알파벳 번호 - source의 알파벳 번호 + 26) % 26을 계산합니다. - 이 값이 처음 구한 이동 칸 수와 한 번이라도 다르면
false를 반환합니다. - 끝까지 모두 같으면
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]]
아직 실행하지 않았습니다.
실행 결과
아직 실행하지 않았습니다.
예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.
댓글
문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.