10989번
import sys
n = int(input()) #입력받는 수의 개수 n
n_list = [0] * 10001 # 리스트크기 <= 10000
for i in range(n):
n_list[int(sys.stdin.readline())] += 1
for i in range(10001):
if n_list[i] != 0:
for j in range(n_list[i]):
print(i)
-
계수정렬 알고리즘
- 배열의 인덱스를 특정한 데이터의 값으로 여기는 정렬 방법
- 배열의 크기는 데이터의 범위를 포함할 수 있도록 설정
- 데이터가 등장한 횟수를 셈
-
일반적으로 sort를 쓰면 시간초과가 나는 문제이다.
-
리스트를 만들고 각각의 리스트에 0이라는 값을 할당해준다.
-
그 리스트에다가 값을 할당해줄때마다 1을 더해준다.
-
입력을 다 받고나면 0보다 큰 요소를 갖고 있는 인덱스를 찾아서 출력해주면 됨.
2108번
from collections import Counter
import sys
input = sys.stdin.readline
n = int(input())
arr = []
for _ in range(n):
arr.append(int(input()))
arr.sort()
print(round(sum(arr)/n))
print(arr[n//2])
temp = Counter(arr).most_common()
if len(arr) > 1:
if temp[0][1] == temp[1][1]:
print(temp[1][0])
else:
print(temp[0][0])
else:
print(temp[0][0])
print(max(arr) - min(arr))
- 파이썬의 Counter 클래스는 iterable의 원소의 개수를 셀 때 편리하게 사용할 수 있는 기능으로, 딕셔너리 객체와 유사하다.
Counter
from collections import Counter
- clear() : 카운터 객체에서 모든 key-value 쌍을 제거
- copy() : 카운터 객체의 복사본을 반환
- elements() : 카운터 숫자만큼 요소 반환
- 리스트를 가지고 카운터 객체를 만들었다면, 다시 리스트로 돌린다고 생각하면 쉽다. 물론 순서는 바뀐다. list(c2.elements())와 같이 사용.
- get() : 인자로 key를 입력하면 해당 key와 매칭되는 value를 반환
- items() : key, value 쌍을 튜플 형태로 반환
- keys() : 카운터 객체의 key들을 반환
- most_common() : 가장 빈도수가 높은 key, value 쌍부터 튜플 형태로 반환. 인자로 숫자(개수)를 전달하면 가장 빈도수가 높은 것부터 해당 개수만큼의 쌍만이 반환됨
- pop() : 인자로 key를 반드시 전달해야 하며, key와 매칭되는 value를 반환하고 해당 key, value 쌍을 카운터 객체에서 제거
- popitem() : 전달하는 인자가 없어야 하며, 가장 뒤의 key, value 쌍을 튜플 형태로 반환하고 해당 쌍을 카운터 객체에서 제거
- setdefault() : 카운터 객체에 key, value 쌍을 추가할 때 사용할 수 있음
- key만 전달하면 카운트 수는 디폴트로 None
- key와 함께 default=10과 같이 전달하면 key에 해당하는 카운트에 입력한 숫자가 반영됨
- subtract() : iterable을 전달하면 각 요소의 값을 각각 빼주고 그 결과의 카운트는 마이너스 값을 가질 수도 있음
- update() : iterable을 전달하여 같은 값이 있으면 카운트가 추가되게 하고 없으면 새로운 key, value 쌍을 생성
- values() : 카운터 객체의 value, 즉 카운트들을 반환
- 이 외에 더하기, 빼기, 교집합, 합집합 연산도 가능하다. 빼기 연산에서 카운트가 음수 값을 가지게 만들고 싶다면 subtract()를 사용하자.