Counter

  • Counter๋Š” Python์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค
  • ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ฌธ์ž์—ด ๋“ฑ์˜ iterable ๊ฐ์ฒด์—์„œ ๊ฐ ์š”์†Œ์˜ ๋นˆ๋„(ํšŸ์ˆ˜)๋ฅผ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋กœ, ๋นˆ๋„ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ํŠนํ™”๋œ ๋”•์…”๋„ˆ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ

Counter์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

Counter๋Š” ์ฃผ์–ด์ง„ iterable์„ ์ž…๋ ฅ๋ฐ›์•„, ๊ฐ ์š”์†Œ๋ฅผ ํ‚ค(key)๋กœ, ํ•ด๋‹น ์š”์†Œ์˜ ๋นˆ๋„(๊ฐœ์ˆ˜)๋ฅผ ๊ฐ’(value)์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

from collections import Counter 
 
# ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ ์š”์†Œ์˜ ๋นˆ๋„ ๊ณ„์‚ฐ 
votes = [1, 2, 2, 3, 3, 3] 
counter = Counter(votes) 
 
print(counter) 
# ์ถœ๋ ฅ: Counter({3: 3, 2: 2, 1: 1})

๋”•์…”๋„ˆ๋ฆฌ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘

  • Counter ๊ฐ์ฒด๋Š” ๋”•์…”๋„ˆ๋ฆฌ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•จ. ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ์š”์†Œ์˜ ๋นˆ๋„๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜, ์ƒˆ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
counter = Counter([1, 2, 2, 3, 3, 3]) 
 
print(counter[2])  
# 2์˜ ๋นˆ๋„ ์ถœ๋ ฅ: 2 
counter[2] += 1    
# 2์˜ ๋นˆ๋„ ์ฆ๊ฐ€ 
print(counter[2])  
# 2์˜ ๋นˆ๋„ ์ถœ๋ ฅ: 3
 


์ฃผ์š” ๋ฉ”์„œ๋“œ

1. values()

  • counter.values()๋Š” ๊ฐ ํ›„๋ณด์˜ ํˆฌํ‘œ ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์คŒ
max_vote = max(counter.values())

### 2. **`items()`** - counter.items()๋Š” ๊ฐ ํ›„๋ณด์™€ ํˆฌํ‘œ ์ˆ˜์˜ ์Œ์„ ๋ฐ˜ํ™˜ ```python #enumerate ์“ธ ๋•Œ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ res = [i for i, value in counter.items() if value == max_vote] ```
### 3. **`most_common(n)`**
  • ๋นˆ๋„ ์ˆ˜๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ์ƒ์œ„ n๊ฐœ์˜ ์š”์†Œ์™€ ๋นˆ๋„๋ฅผ ๋ฐ˜ํ™˜
counter = Counter([1, 2, 2, 3, 3, 3]) 
print(counter.most_common(1)) 
# ์ถœ๋ ฅ: [(3, 3)]  # ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ 3์ด 3๋ฒˆ ๋“ฑ์žฅ

### 4. **`del`** - `del` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ํ‚ค๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ
`counter = Counter([0, 1, 2, 0, 3]) 
 
del counter[0]  # 0์˜ ๋นˆ๋„๋ฅผ ์ œ๊ฑฐ 
 
print(counter) 
# ์ถœ๋ ฅ: Counter({1: 1, 2: 1, 3: 1})`


์ฐธ๊ณ  ์˜ˆ์ œ : ๋ฐฑ์ค€ 20113๋ฒˆ ๊ธด๊ธ‰ ํšŒ์˜


๋ฐฑ์ค€ 20113๋ฒˆ ๊ธด๊ธ‰ ํšŒ์˜

import sys
from collections import Counter
 
n = int(sys.stdin.readline())
vote = list(map(int, sys.stdin.readline().split()))
# vote๋งŒ ์‚ฌ์šฉํ•ด์„œ enumerate๋กœ ํ•˜๋ฉด 0 ๊ฐ’ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์›€
# 0์€ ํˆฌํ‘œ๋ฅผ ๋ฐ›์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ 0์„ ์ œ์™ธํ•œ ํ›„๋ณด๋“ค์˜ ํˆฌํ‘œ ์ˆ˜๋ฅผ ์นด์šดํŠธ
counter = Counter(vote)
if 0 in counter:
    del counter[0]
 
# ํˆฌํ‘œ ์ˆ˜๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด "skipped"
if not counter:
    print("skipped")
else:
    # counter.values()๋Š” ๊ฐ ํ›„๋ณด์˜ ํˆฌํ‘œ ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์คŒ
    # max๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ๋‹ค ๋“ํ‘œ์ˆ˜ ๊ณ„์‚ฐ
    max_vote = max(counter.values())
    
    # counter.items()๋Š” ๊ฐ ํ›„๋ณด์™€ ํˆฌํ‘œ ์ˆ˜์˜ ์Œ์„ ๋ฐ˜ํ™˜
    # enumerate ์“ธ ๋•Œ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ
    res = [i for i, value in counter.items() if value == max_vote]
    
    if len(res) > 1:  # ๋™์ ์ž ์žˆ์„ ๋•Œ
        print("skipped")
    else: # ์ตœ๋‹ค ๋“ํ‘œ์ž ์œ ์ผ
        print(res[0])
 

์ด ์ฝ”๋“œ์—์„œ Counter์˜ ์‚ฌ์šฉ ๋ชฉ์ 

  • ํ›„๋ณด๋ณ„ ํˆฌํ‘œ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ: vote ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๊ฐ ํ›„๋ณด ID์˜ ๋นˆ๋„๋ฅผ ๊ณ„์‚ฐ
  • ํˆฌํ‘œ๋ฅผ ๋ฐ›์ง€ ์•Š์€ ๊ฒฝ์šฐ(๊ฐ’์ด 0)๋ฅผ ์ œ์™ธ: ํ›„๋ณด ID๊ฐ€ ์•„๋‹Œ 0 ๊ฐ’์„ ๋ฌด์‹œ
  • ์ตœ๋‹ค ๋“ํ‘œ์ž๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ํ™œ์šฉ: Counter ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ ํ›„๋ณด์˜ ๋“ํ‘œ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ๋‹ค ๋“ํ‘œ์ž์™€ ๋™์  ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ

์ฝ”๋“œ ํ๋ฆ„

  • ์ž…๋ ฅ ์ฒ˜๋ฆฌ
    • n์€ ํˆฌํ‘œ ์ˆ˜, vote๋Š” ํˆฌํ‘œ ๋ฐ์ดํ„ฐ(ํ›„๋ณด ID ๋ชฉ๋ก)
  • ํˆฌํ‘œ ์ˆ˜ ๊ณ„์‚ฐ
    • Counter(vote)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ›„๋ณด ID์˜ ํˆฌํ‘œ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
    • 0์„ ์ œ๊ฑฐํ•˜์—ฌ ํˆฌํ‘œํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฌด์‹œ
  • ๊ฒฐ๊ณผ ํŒ๋ณ„
    • max_vote๋ฅผ ์ด์šฉํ•ด ์ตœ๋‹ค ๋“ํ‘œ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
    • res๋ฅผ ์ด์šฉํ•ด ์ตœ๋‹ค ๋“ํ‘œ ํ›„๋ณด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ
    • ๋™์ ์ž๊ฐ€ ์žˆ์œผ๋ฉด โ€œskippedโ€๋ฅผ ์ถœ๋ ฅ
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ์ผํ•œ ์ตœ๋‹ค ๋“ํ‘œ์ž์˜ ID๋ฅผ ์ถœ๋ ฅ