Stay Hungry Stay Foolish

SWEA

[SWEA] 10912. 외로운 문자 (Python/D3)

dev스카이 2024. 11. 1. 18:39

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


Solution

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    word = input().strip()
    word = sorted(word)  # 정렬하기

    result = ""
    for i in word:
        if word.count(i) % 2 != 0:
            if i not in result:
                result += i

    if len(result) == 0:
        result = "Good"

    print(f"#{test_case} {result}")

 

이 문제에서는 각 문자의 개수를 짝지어 남는 문자를 찾기 때문에, count() 함수를 반복적으로 호출하지 않고, 문자 빈도수를 저장한 후, 각 문자가 짝이 맞지 않는지 확인하여 남는 문자를 추출하는 것이 더 효율적이다. Counter를 활용해 각 문자의 등장 횟수를 구하고, 홀수 개수인 문자만 결과에 추가하는 방법으로 최적화할 수 있다.

 

개선할 점

  • Counter를 사용한 빈도 계산
    • Counter는 문자열 전체를 한 번만 순회하여 각 문자의 빈도를 기록하므로 효율적이다.
  • 사전 순서
    • 최종적으로 남는 문자를 sorted()로 정렬하여 사전 순서를 유지한다.
  • 조건부 추가
    • count % 2 != 0 조건을 통해 홀수 개수인 문자만 빠르게 추출한다.

 

최적화된 코드

from collections import Counter

T = int(input())  # 테스트 케이스 수
for test_case in range(1, T + 1):
    word = input().strip()
    char_count = Counter(word)  # 각 문자의 개수를 세어 저장

    # 홀수 개수인 문자만 남김
    result = ''.join(sorted(char for char, count in char_count.items() if count % 2 != 0))

    # 남는 문자가 없다면 "Good"을 출력
    if not result:
        result = "Good"

    print(f"#{test_case} {result}")

 

 

컴프리헨션을 쓰지 않은 코드

result = []
    for char, count in char_count.items():
        if count % 2 != 0:
            result.append(char)
    result = ''.join(sorted(result))