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

파이썬으로 문자열 속 공룡 수 세기

animals라는 문자열과 dinosaurs라는 또 다른 문자열이 있다고 가정해 보겠습니다. animals의 모든 글자는 서로 다른 동물의 종류를 나타내며, dinosaurs 문자열의 각 고유 문자는 서로 다른 공룡을 나타냅니다. 우리가 구해야 할 것은 animals 문자열 안에 포함된 공룡의 총 마릿수입니다.

예를 들어, 입력이 animals = "xyxzxyZ", dinosaurs = "yZ"라고 한다면 출력은 3이 됩니다. 공룡의 종류는 y와 Z 두 가지이고, animals 문자열에는 y가 두 번, Z가 한 번 등장하기 때문입니다.

해결 접근 방법

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  • 결괏값을 저장할 변수 res를 0으로 초기화합니다.
  • dinosaurs 문자열을 set(집합)으로 변환하여 중복된 문자를 제거합니다.
  • 집합에 있는 각 문자 c에 대해 animals에서 해당 문자가 등장하는 횟수를 res에 더합니다.
  • 모든 반복이 끝나면 res를 반환합니다.

예제 코드

아래 구현 예제를 통해 더 자세히 이해해 보겠습니다.

class Solution:
    def solve(self, animals, dinosaurs):
        res = 0
        dinosaurs = set(dinosaurs)
        for c in dinosaurs:
            res += animals.count(c)
        return res

ob = Solution()
animals = "xyxzxyZ"
dinosaurs = "yZ"
print(ob.solve(animals, dinosaurs))

입력

"xyxzxyZ", "yZ"

출력

3

코드 설명

set(dinosaurs)를 호출하면 dinosaurs 문자열이 집합으로 변환되면서 중복 문자가 자동으로 제거됩니다. 덕분에 같은 공룡 문자를 여러 번 세는 실수를 방지할 수 있습니다. 이후 animals.count(c)는 animals 문자열에서 문자 c가 나타나는 횟수를 반환하므로, 각 공룡 문자의 등장 횟수를 모두 더하면 원하는 답을 얻을 수 있습니다.

시간 복잡도 측면에서 보면, 고유한 공룡 문자의 수를 k, animals 문자열의 길이를 n이라 할 때 전체 시간 복잡도는 O(k × n)입니다. 문자열이 매우 길다면 아래와 같이 collections.Counter를 활용하면 한 번의 순회로 빈도를 계산해 더 효율적으로 처리할 수 있습니다.

from collections import Counter

class Solution:
    def solve(self, animals, dinosaurs):
        counter = Counter(animals)
        return sum(counter[c] for c in set(dinosaurs))

두 방법 모두 결과는 동일하게 3을 출력하지만, 데이터 크기가 커질수록 Counter 기반 접근이 유리합니다. 상황에 맞게 적절한 방법을 선택해 사용하시기 바랍니다.