매일 매일 미라클 코딩
[BOJ - 1157] 단어공부 (feat. Counter 함수) 본문
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
기본적인 문제 같은데 생각보다 dict 자료형 활용법을 몰랐던 것 같아서 정리
접근)
1. 입력받은 문자열을 모두 소문자로 바꾼다
2. Counter 함수로 문자 별 쓰인 횟수를 dict 형으로 만든다.
* 이때 카운터를 출력해보면 알아서 가장 많은 순으로 정렬되어있는 것을 알 수 있다.
* 그래서 카운터 객체의 keys() 중 0번째 인덱스를 반환하려고 했는데, keys() 같은 함수를 반환하면 정렬된 대로 나오지 않는다.
3. 값을 정렬해서 max 값을 뽑아낸다. 같은 값이 정렬된 Dict 밸류에 있으면 바로 ? 을 출력
최댓값이 하나인 경우 해당 값을 가진 key 를 반복문으로 찾아낸다.
from operator import itemgetter
from collections import Counter
str = input().lower()
#딕셔너리에 있으면 없으면
c =Counter(str) # 알아서 많은 순으로 sorting 이 되네
val = sorted(list(c.values()))
max = val.pop()
if max in val:
print("?")
else:
for i in c.keys():
if c[i] == max:
print(i)
break
이때 Counter 정렬로 찾아내려고 엄청 애썼다.
itemgetter 를 임포트하면 다음과 같이 값과 키 별로 정렬할 수 있다.
#입력이 Classroom 인경우
c = sorted(c.items(),key=itemgetter(0)) #key 기준 오름차순 정렬
print(c)
c = sorted(c.items(),key=itemgetter(1), reverse=True) #value 기준 내림차순 정렬
print(c)
OUTPUT
[('a', 1), ('c', 1), ('l', 1), ('m', 1), ('o', 2), ('r', 1), ('s', 2)]
[('s', 2), ('o', 2), ('c', 1), ('l', 1), ('a', 1), ('r', 1), ('m', 1)]
딕셔너리 자료형의 경우 각 인자를 튜플 형태로 반환하므로 itemgetter의 매개변수는 튜플의 0번째 인덱스= Key, 1번째 인덱스 =Value 로 이해할 수 있다.
'알고리즘' 카테고리의 다른 글
[Lv.3] 프로그래머스 - 입국심사 (이분탐색) (0) | 2021.05.20 |
---|---|
[BOJ 4948] - 베르트랑 공준 (에라토스테네스의체 알고리즘) (0) | 2021.05.14 |
[BOJ-1697] 숨바꼭질 (BFS) (0) | 2021.05.07 |
[Lv.2] 프로그래머스 - 정렬 - H-Index (0) | 2021.04.23 |
[Lv.2] 프로그래머스 - 완전탐색 - 소수찾기 문제 (0) | 2021.04.23 |