본문 바로가기
Etc./Python

[Python] collections- Counter

by ahj 2021. 10. 11.

주어진 예제

https://programmers.co.kr/learn/courses/4008/lessons/13246

 

파이썬을 파이썬답게 - 가장 많이 등장하는 알파벳 찾기

본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코

programmers.co.kr

<문제>

이 문제에는 표준 입력으로 문자열, mystr이 주어집니다. mystr에서 가장 많이 등장하는 알파벳만을 사전 순으로 출력하는 코드를 작성해주세요.

 

짱구 굴려서 검색해가면서 짰다.

import string
alphabets=string.ascii_lowercase#a to z 문자열 저장
atoz={}
for index, alphabet in enumerate(alphabets):
    atoz[index]=alphabet
atoz_values=list(atoz.values())
cnt=[0]*26#몇개 있는지 세어줄 list
my_str = input().strip()#문자열 입력
for i in range(len(my_str)):#입력된 문자열 처음부터 검사
    for alphabet in atoz_values:# a to z 중에서
        if my_str[i] == alphabet:# 같은 값이 있다면
            cnt[atoz_values.index(alphabet)]+=1#
            break
#여기부터는 max가 중복 될 수 있으니까 고려해주기 위한 코드
max_index=[]#max 주소들 저장할 list
cnt_max=[]
for i in range(26):#알파벳 전부에 대해서 검사
  i_max=cnt.index(max(cnt))#이거는 대문자 상수로 해줬어야 됐네..
  max_index.append(i_max)#max인덱스 list에 저장
  cnt_max.append(cnt[i_max])#max count 값 비교하기 위해 list에 저장하기
  cnt[i_max]=0#가장 많이 세어진 알파벳 0으로 바꿔서 그 다음 큰 값을 for문에서 찾아줄 수 있다.
  if cnt_max[i]<cnt_max[i-1]:#즉, i번째로 저장된 max count값이 중복이 아니라면 그 전까지만 제일 많이 있는 알파벳이니까
    max_index.remove(max_index[i])#위에서 저장했던 해당 주소값 삭제
    break#for문 탈출
max_index.sort()
for j in range(len(max_index)):
  print(atoz[max_index[j]],end='')

그지같이도 짰다.

하지만 collections 쓰지 않고서는 어떻게 짜야할지 잘 모르겠다. 이렇게 list 여러개 쓰는 수밖에 없을거 같은데 아무튼 킹왕짱 Counter를 드디어 써보자

https://devahj.tistory.com/7

이때도 한번 살펴봤지만 오늘 더 자세히 보도록 하자

import collections
my_str = input().strip()
count_dict=dict(collections.Counter(my_str))#count된 char들 dict에 저장
MAX=max(count_dict.values())#최대 count 일단 저장
alph_list=[]
for key, value in count_dict.items():
  if value==MAX:#MAX_COUNT가 여러개 있는 경우를 간단하게 처리해보았다!
    alph_list.append(key)#해당 key(여기선 알파벳) list에 저장
answer=''.join(sorted(alph_list))#순서대로를 원했으니 정렬해주고 join으로 string묶어주기
print(answer)

그냥 Counter 쓴다고 능사는 아니구만..ㅎ 생각을 해주긴 해야한다.

만약 aaab를 my_str에 입력하고

count_dict를 print하면

{'a':3, 'b':1}

이렇게 나온다

역시 예시를 들어야 쉽게 이해된다. Counter 함수 잘 쓰자!

dict에서 value의 경우는 dict['key']를 통해 구할 수 있다. 하지만 value를 이용해서 key는 어떻게 구해주지?? 해서 검색해보니 이것 저것 나오던데 저렇게 items의 pairing을 통해서 구해주는게 구현하기에도 재일 간편한 것 같다.

value로 key구하기는 다시 따로 정리하는 거로

'Etc. > Python' 카테고리의 다른 글

[Python] for-else  (0) 2021.10.11
[Python] dictionary에서 value로 key 구하기  (0) 2021.10.11
[Python] itertools-2  (0) 2021.10.10
[Python] list 나름 정리  (0) 2021.10.10
[Python] itertools  (0) 2021.10.10

댓글