programming

알고리즘 - 문자열이 주어진 경우 반복되는 문자열 수 구하기 파이썬 풀이


by Kitle · 2020. 07. 22.



오늘의 퀴즈는 다음과 같습니다.


다음과 같은 문자열이 주어집니다.


[입력값]

s = 'aabbccd'

[출력값]

a2b2c2d1


[입력값]

s = 'abc'

[출력값]

'a1b1c1'


문장 왼쪽부터 시작하여 a가 두번 반복, b 두번, c 두번, d 한번 반복되었습니다. 따라서 문자열이 연속적으로 나온 횟수를 다음과 같이 출력하고 싶습니다.

*입력값은 1글자 이상 10,000 글자 이내로 주어집니다.

대소문자는 다른 문자로 구분합니다.


[풀이]

def solution(s):
index = None
result = ''
for idx, item in enumerate(s):
if index is None:
index = idx
elif s[index] != item:
result += str(s[index])+str(len(s[index:idx]))
index = idx
result += str(s[index])+str(len(s[index:]))

return result


s='aabbcc'
print(solution(s))

[해설]

'aabbcc' 라는 문자열이 주어졌을때 문자열 위치를 체크하기 위해 Index 변수를 활용했습니다. 왼쪽으로 부터 오른쪽으로 갈 경우 index는 반복 단어의 시작 위치가 되며, 같은 단어가 나오면 변하지 않고 다른 단어가 뒤에 나오면 해당 시작점을 index를 교체해 줍니다. 

처음엔 비교할 단어가 없을 것입니다.

첫 단어위치인 idx를 index에 넣고 끝납니다.

for 문을 순회하여 두번째 단어 a에 도달했을때 기존 index에 위치한 단어는 s[index] , s[0] 으로 인해 a 이며, 현재 위치는 한칸 이동한 item 으로 s[idx] s[1]과 같습니다. 두 단어가 같다면, 한칸 더 전진해야 합니다. 따로 처리할 것은 없고 for 문이 해줍니다.

이제 세번째 b를 만났습니다. aab 이므로 이제 a2 를 출력해야 합니다. s[index] 의 값을 그대로 가져오면 됩니다. 그리고 len()을 이용하여 첫 index가 있는 곳부터 현재 위치 즉 idx 까지의 길이를 세어주면 됩니다. 시작 인덱스가 0이고 현재 idx가 0,1,2 a,a,b 순으로 되었으니 길이는 [0:3] 을 세면 2가 나올 것입니다. 그러면 a가 2번 반복되었다고 계산할 수 있습니다.

그리고 나서 이제 b의 시작점 idx 가 새로운 시작 index 가 되므로 index = idx 로 변경 해줍니다.

마지막 출력결과를 모두 한번의 스트링으로 만들어야 하니 간단하게 + 연산자로 합쳐주면 됩니다.

시작은 빈 문자열로부터 시작해 결과를 result = result + 부분값(a1 등)을 계속 더하면 됩니다.

맨 마지막까지 도달한다면 같은 값이므로 저장이 되지 않습니다. 따라서 마지막 문장에  이또한 현재 위치로부터 마지막까지 문자와 길이를 더해주는 부분을 추가하면 되겠습니다.

s='aabbcc' #수행결과

a2b2c2

Process finished with exit code 0