클래스: from collections import Counter

2024. 5. 12. 15:58전처리/PYTHON

 

01 이전 학습 내용


TIL 116일차 : 알고리즘 deque 쉽게 이해하기 (tistory.com)

TIL 135일차 : 그리디 알고리즘 쉽게 이해하기 (tistory.com)

 

02 remove, in은 시간복잡도를 증가시킨다.


문제 :  10816번: 숫자 카드 2 (acmicpc.net)

문제 : 시간 초과

a = input()
cnt = input().split()
b = input()
card = input().split()

result = []
for i in card:
    num=0
    if i in cnt:
        while True:
            try:
                cnt.remove(i)
                num+=1
            except:
                result.append(str(num))
                break
    else:
        result.append('0')

print(" ".join(result))

기존 풀이 과정에서 remove 메소드와 in 연산자를 사용하는 것은 리스트에 대한 선형 탐색을 필요로 하며, 시간 복잡도를 증가시킨다. 특히, remove 메소드는 발견한 첫 번째 항목만 제거하고 나머지 리스트를 재정렬하기 때문에 비효율적이다.

 

03 해결 방법 : Counter 클래스


from collections import Counter

a = input()
cnt = input().split()
b = input()
card = input().split()

class_counter = Counter(cnt)

result = []
for i in card:
    result.append(str(class_counter[i]))

print(" ".join(result))

 

1. Counter 클래스는 cnt 리스트의 각 요소별 등장 횟수를 센다.
2. Counter 객체는 해당 키가 없을 경우 기본값으로 0을 반환한다.

💡한 단계 더 나아가서 : 파이썬은 print 함수 자체에 공백을 기준으로 여러 값을 출력하는 기능이 있다. * 연산자를 사용하여 리스트의 요소들을 print 함수에 인자로 전달하면 된다. 이때 입력 받는 리스트의 값은 문자열, 숫자열 상관없다.

 

기본 틀이 되는 중요 코드는 아래와 같다.

from collections import Counter

class_counter = Counter(cnt)

result = []
for i in card:
    result.append(str(class_counter[i]))

print(*result)

 

04 후기


전처리할 때 사용해봤는데 막상 문제풀이에서 사용하려니 처음에 생각이 나지 않았다. 덱 다음으로 새로운 메소드를 배울 때 기분과 같다. 처리 속도가 이렇게 빨라질 수 있음이 유익하다.