문자열 세기 count()와 Counter() 차이를 알고 items()와 values() 활용하기

HEE·2025년 4월 27일
0
post-thumbnail

숫자세기는 기본적으로 Counter() 함수를 항상 먼저 생각하기.

1. 프로그래머스 python 코딩테스트 입문

Level 0. 한 번만 등장한 문자

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

나의 오답과 이유

from collections import Counter
def solution(s):
    a = Counter(s)
    return sorted(''.join(a.values()==1))
  • 의도한 것 : values() 값이 1인것의 key값 즉 문자만 join하고, sorted로 오름차순 정렬하고자함.
  • 틀린 점
  1. value값이 1인, key값을 선택해야하는데, 사용함수가 부적절함. values()는 value값만을 반환함, key값을 가져오려면 v,k 둘 다 있는 items() 함수를 사용해야함.
  2. join을 사용하면 문자열이 되나, 그 후 sorted()함수를 사용하면 리스트로 반환됨. (정답은 문자열 반환을 제시함.)
  3. a.values() == 1 이면 참 거짓을 물어보는것처럼 됨. 1 인 값을 구하는게 아님.

정답

1. 나의 오답을 최대한 수정한 답 : Counter() items()

from collections import Counter
def solution(s):
    a = Counter(s)
    b = ''.join(k for k, v in a.items() if v == 1)
    return ''.join(sorted(b))
  • 한줄로 만들기 : 제너레이터 표현식 사용
from collections import Counter
def solution(s):
    return ''.join(sorted(k for k, v in Counter(s).items() if v == 1))

2. count() 만 사용하기

def solution(s):
    return ''.join(sorted(c for c in s if s.count(c) == 1))
  • 문자 하나 확인할때마다 문자열 전체를 매번 다시 스캔해야함. 비효율적. -> Counter() 사용

3. Counter() 만 사용하기

from collections import Counter
def solution(s):
    a = Counter(s)
    b = [i for i in a if a[i] == 1]
    return ''.join(sorted(b))

추가로 복습하면 좋은 점

  • join() : 문자열, 리스트 모두 가능. 숫자는 불가능. (숫자는 문자로 변경 후 사용) [1,2,3,55] 이런 숫자 리스트는 i for i 를 사용하여 문자로 변경한 후, join해야함.
  • count()보다 Counter()가 더 효율적임.
profile
ALL IS WELL

0개의 댓글