클래스: 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 후기
전처리할 때 사용해봤는데 막상 문제풀이에서 사용하려니 처음에 생각이 나지 않았다. 덱 다음으로 새로운 메소드를 배울 때 기분과 같다. 처리 속도가 이렇게 빨라질 수 있음이 유익하다.
'전처리 > PYTHON' 카테고리의 다른 글
알고리즘: 랭킹 1,2,3위 선정 방법 - heapq(힙) 구현하기 (0) | 2024.05.27 |
---|---|
이진탐색 쉽게 이해하기, 알고리즘 문제 풀이 (0) | 2024.05.20 |
정규 표현식을 이용한 토큰화 - NLTK의 RegexpTokenizer (0) | 2024.04.25 |
정규 표현식(import re) 알아보기 (0) | 2024.04.25 |
Python 라이브러리 : Streamlit 실습 (0) | 2024.04.14 |