소문자 문자열 s와 길이가 s의 길이와 동일한 shift라고 하는 또 다른 정수 목록이 있다고 가정합니다. 여기에서 shifts[i]의 각 요소는 shifts[i] 위치만큼 s의 첫 번째 i + 1 문자를 이동한다는 것을 나타냅니다. 이동이 'z'를 가로지르면 'a'로 마무리됩니다. s에 shift를 적용한 후 결과 문자열을 찾아야 합니다.
따라서 입력이 s ="tomato" shifts =[2, 5, 2, 3, 7, 4]와 같으면 출력은 "qjcoes"이므로 첫 번째 문자를 2자리 이동한 후 't '에서 'v'로 변환하므로 문자열은 "vomato"입니다. 그 다음 처음 두 문자는 5자리입니다. 이제 문자열은 "atmato"가 되고 마지막으로 문자열은 "qjcoes"가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- start :="a"의 ASCII
- res :=s의 각 i에 대한 (i - 시작)의 ASCII 목록
- 시프트 범위 크기의 i에 대해 - 2에서 0, 1 감소, do
- shifts[i] :=shifts[i] + shifts[i + 1]
- 0 ~ s - 1 크기 범위의 i에 대해
- c :=(res[i] + shifts[i]) 모드 26
- res[i] :=ASCII 문자(c + 시작)
- res 문자를 문자열로 결합하고 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def solve(s, shifts): start = ord("a") res = [ord(i) - start for i in s] for i in range(len(shifts) - 2, -1, -1): shifts[i] += shifts[i + 1] for i in range(len(s)): c = (res[i] + shifts[i]) % 26 res[i] = chr(c + start) return "".join(res) s = "tomato" shifts = [2, 5, 2, 3, 7, 4] print(solve(s, shifts))
입력
[2, 1], 3, 2
출력
qjcoes