문제 설명
짝수 위치에는 소문자 영어 알파벳이, 홀수 위치에는 숫자가 들어 있는 영숫자(alphanumeric) 문자열 s가 있다고 가정해 보겠습니다.
여기서 shift(c, x)는 임의의 문자 c와 숫자 x를 받아, c에서 x번째 뒤에 있는 문자를 찾는 연산입니다. 예를 들면 다음과 같습니다.
- shift('p', 5) = 'u'
- shift('a', 0) = 'a'
이제 모든 홀수 인덱스 i에 대해 해당 위치의 숫자 s[i]를 shift(s[i-1], s[i])의 결과로 바꿔야 합니다. 즉, 문자열 안의 모든 숫자를 바로 앞의 알파벳을 기준으로 이동한 문자로 치환한 최종 문자열을 구하는 것이 목표입니다.
예시
입력이 s = "a2b1d4f3h2"라면 출력은 "acbcdhfihj"가 됩니다. 그 과정은 다음과 같습니다.
- shift('a', 2) = 'c'
- shift('b', 1) = 'c'
- shift('d', 4) = 'h'
- shift('f', 3) = 'i'
- shift('h', 2) = 'j'
풀이 접근 방법
이 문제는 문자열을 한 번만 순회하면 간단하게 해결할 수 있습니다. 절차는 다음과 같습니다.
- 결과를 저장할 빈 문자열 res를 준비합니다.
- i를 0부터 문자열 길이까지 반복합니다.
- s[i]가 숫자라면, res에 (s[i-1]의 아스키 코드 값 + s[i]의 정숫값)에 해당하는 문자를 이어 붙입니다.
- 그렇지 않고 알파벳이라면, res에 s[i]를 그대로 이어 붙입니다.
- 반복이 끝나면 res를 반환합니다.
핵심은 내장 함수 두 개입니다. ord()는 문자를 아스키 코드 값으로 변환하고, chr()는 코드 값을 다시 문자로 되돌려 줍니다. 또한 int(s[i])를 사용해 문자 형태의 숫자를 실제 정수로 바꾼 뒤 더하면 됩니다.
구현 코드
def solve(s):
res = ""
for i in range(len(s)):
if s[i].isdigit():
res += chr(int(s[i]) + ord(s[i-1]))
else:
res += s[i]
return res
s = "a2b1d4f3h2"
print(solve(s))
입력
"a2b1d4f3h2"
출력
acbcdhfihj
복잡도 분석
문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 결과 문자열을 저장하기 위한 공간 복잡도 역시 O(n)입니다. n은 입력 문자열의 길이입니다.