Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 문자열의 모음과 자음을 각각 정렬해 하나로 합치는 프로그램

문제 개요

소문자로만 이루어진 문자열 s가 주어졌을 때, 문자열에 포함된 모든 모음(vowel)을 사전순으로 정렬한 뒤, 그 뒤에 자음(consonant)을 사전순으로 정렬하여 이어 붙인 새로운 문자열을 만드는 것이 목표입니다.

예를 들어 입력이 "helloworld"라면 출력은 "eoodhlllrw"가 됩니다. 이 문자열에서 모음은 e, o, o 세 개이며, 자음을 정렬하면 d, h, l, l, l, r, w 순서가 되기 때문입니다.

풀이 접근 방법

이 문제는 다음과 같은 단계로 해결할 수 있습니다.

  • 모음을 담을 문자열 k와 자음을 담을 문자열 t를 빈 문자열로 초기화합니다.
  • 입력 문자열 s의 각 문자 c를 처음부터 끝까지 순회합니다.
  • c가 모음('a', 'e', 'i', 'o', 'u')에 속한다면 k에 추가하고, 그렇지 않다면 t에 추가합니다.
  • 순회가 끝나면 kt를 각각 정렬한 후 두 문자열을 연결하여 반환합니다.

구현 예제

아래 코드를 통해 실제 동작을 더 쉽게 이해할 수 있습니다.

class Solution:
   def solve(self, s):
      vowels = 'aeiou'
      k = ''
      t = ''
      for c in s:
         if c in vowels:
            k += c
         else:
            t += c
      return ''.join(sorted(k)) + ''.join(sorted(t))

ob = Solution()
print(ob.solve("helloworld"))

입력

"helloworld"

출력

eoodhlllrw

코드 설명 및 시간 복잡도

위 코드는 문자열을 한 번만 순회하면서 모음과 자음을 분리하기 때문에 순회 과정은 O(n)의 시간이 걸립니다. 이후 각 그룹을 정렬할 때 O(n log n)의 비용이 발생하므로, 전체 시간 복잡도는 O(n log n)입니다. 공간 복잡도는 입력 길이에 비례하는 O(n)입니다.

또한 파이썬의 내장 함수 sorted()''.join()을 활용하면 별도의 정렬 알고리즘을 직접 구현하지 않고도 간결하게 결과를 얻을 수 있습니다. 대소문자가 섞인 입력이 주어질 경우에는 문자를 비교하기 전에 c.lower()로 변환하면 같은 로직을 그대로 적용할 수 있습니다.