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

Python으로 문자열에서 두 번째로 큰 숫자를 찾는 방법

영문자와 숫자가 섞여 있는 문자열 s가 주어졌다고 가정해 보겠습니다. 이때 우리가 해야 할 일은 문자열 안에 등장하는 숫자들 중 두 번째로 큰 값을 찾는 것입니다. 만약 조건을 만족하는 숫자가 존재하지 않는다면 -1을 반환하면 됩니다.

예를 들어 입력이 s = "p84t3ho1n"이라면, 문자열에 포함된 숫자는 [1, 3, 4, 8] 네 개입니다. 가장 큰 숫자는 8이고, 두 번째로 큰 숫자는 4이므로 결과값은 4가 됩니다.

문제 해결 접근 방법

이 문제는 다음 단계를 통해 간단히 해결할 수 있습니다.

  • 집합 생성: 중복 제거를 위해 새로운 집합(set)인 lst를 만듭니다.
  • 숫자 추출: 문자열 s의 각 문자를 하나씩 확인하면서, 알파벳이 아닌 문자(즉, 숫자)만 골라 정수형으로 변환한 뒤 lst에 추가합니다.
  • 예외 처리: 서로 다른 숫자가 1개 이하라면 두 번째로 큰 값이 존재하지 않으므로 -1을 반환합니다.
  • 결과 반환: lst를 오름차순으로 정렬한 후, 뒤에서 두 번째 요소를 반환합니다.

Python 구현 예제

더 나은 이해를 위해 실제 코드 구현을 살펴보겠습니다.

def solve(s):
    lst = set()
    for let in s:
        if not let.isalpha():
            lst.add(int(let))
    if len(lst) <= 1:
        return -1
    return sorted(list(lst))[len(lst) - 2]

s = "p84t3ho1n"
print(solve(s))

입력

"p84t3ho1n"

출력

4

코드 동작 원리

isalpha() 메서드는 해당 문자가 알파벳인지 판별합니다. 따라서 not let.isalpha() 조건은 문자가 숫자일 때 참이 됩니다. 또한 집합(set)을 사용하기 때문에 같은 숫자가 여러 번 등장해도 자동으로 중복이 제거됩니다.

마지막 줄의 sorted(list(lst))[len(lst) - 2]는 집합을 리스트로 변환해 정렬한 다음, 인덱스를 이용해 두 번째로 큰 값을 꺼내는 부분입니다. 예를 들어 [1, 3, 4, 8]을 정렬하면 길이가 4이므로 인덱스 2의 값, 즉 4를 반환하게 됩니다.

이 방식의 시간 복잡도는 O(n log n)으로, 문자열 길이에 비례하며 정렬 비용이 지배적입니다. 문자열이 매우 길지 않은 경우에는 충분히 효율적이고 직관적인 접근법입니다.