[ 백준 문제 1157 / 파이썬 ] 단어 공부

2023. 2. 10. 17:41백준/파이썬

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

알파벳 대소문자로 된 단어가 주어지면,
이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오.
단, 대문자와 소문자를 구분하지 않는다.

 

저는 이 문제를 보고

① 처음에 알파벳을 다 소문자로 바꿔두고

words = input().lower()

 

② key에 알파벳을, value에 알파벳 개수를 넣은 딕셔너리를 생성해야겠다고 생각했습니다.

alpha = dict()
for i in words:
    try:
        alpha[i] += 1
    except:
        alpha[i] = 1

 

③ 그리고 value 중에서 최대값을 알아내서

max_alpha_val = max(alpha.values())

 

④ 최대값인 value를 가진 key값을 찾고

⑤ 최대값인 value를 가진 key가 두개 이상이면 ?를 출력하고,

⑥ 하나면 그 key를 대문자로 변환해서 출력할 겁니다.

 

value로 key 불러오기

1) key:value 위치 바꿔주기
1-1. reverse_a = dict(map(reversed, a.items()))

1-2. reverse_a = {v:k for k,v in a.items()}

2) 리스트 컴프리 헨션
[k for k, v in a.items() if v == 1]
>> [ 'm', 'p' ]

 

1) key:value 위치 바꿔주기

 

key값과 value값의 위치가 바뀐 딕셔너리를 만들어서

value 값을 key로 사용하여 value의 조건에 해당하는 key를 value처럼 찾아내주겠습니다.

 

reverse_alpha = dict(map(reversed, alpha.items()))

 

이렇게 해줬습니다.

 

여기서 문제가 있는데, 뭘까요?

 

key는 고유한 값을 가진다는 특징입니다.

 

예제에 있는 Mississipi를 입력하고 reverse_alpha 딕셔너리를 출력하면,

{1: 'p', 4: 's'} 이런 딕셔너리가 나옵니다.

 

그러면 이 방법은 틀렸고, 2번 방법을 사용할게요.

 

2) 리스트 컴프리 헨션

find_key_list = [k for k,v in alpha.items() if v == max(alpha.values())]

 

리스트를 만들어줬고, 최대값인 value를 value로 가질 때의 key만 리스트에 담아줍니다.

 

그러면 ④ 최대값인 value를 가진 key값 찾기 완료!

 

⑤ 최대값인 value를 가진 key가 두개 이상이면 ?를 출력하기

⑥ 하나면 그 key를 대문자로 변환해서 출력하기

if len(find_key_list) >= 2:
    print("?")
else:
    for j in find_key_list:
        print(j.upper())

 

전부 완료했습니다!

저는 if문 안에 for문을 써도 된다고 합니다.

 

나의 최종 정답 :

words = input().lower()

alpha = dict()
for i in words:
    try:
        alpha[i] += 1
    except:
        alpha[i] = 1

find_key_list = [k for k,v in alpha.items() if v == max(alpha.values())]

if len(find_key_list) >= 2:
    print("?")
else:
    for j in find_key_list:
        print(j.upper())

 

+ 딕셔너리 공부

 

key로 value 불러오기

1)  .get(key) 
a.get('m')
>> 1

※딕셔너리에 존재하지 않는 키로 값을 가져오려고 할 경우
a.get('a')
>> None

존재하지 않는 키를 사용했을 때 None 대신 디폴트 값 설정 가능
a.get('a', 0)
>> 0

2)  a['m']
>>1

※딕셔너리에 존재하지 않는 키로 값을 가져오려고 할 경우
a['a']
>>에러가 발생함. keyError
value로 key 불러오기

1) key:value 위치 바꿔주기
1-1. reverse_a = dict(map(reversed, a.items()))

1-2. reverse_a = {v:k for k,v in a.items()}

2) 리스트 컴프리 헨션
[k for k, v in a.items() if v == 1]
>> [ 'm', 'p' ]

 

 

사전, Dictionary의 함수들

a = {'m': 1, 'i': 4, 's': 4, 'p': 1 }

.keys() : 키 값만!
a.keys()
>> dict_keys([ 'm', 'i', 's', 'p' ])

dict_keys 객체를 돌려줍니다.

list(a.keys())
>> [ 'm', 'i', 's', 'p' ]

딕셔너리 a에 있는 키값으로만 이루어진 리스트가 출력됩니다.

.values() : 밸류 값만!
a.values()
>> dict_values([ 1, 4, 4, 1 ])

dict_values 객체를 돌려줍니다.

list(a.values())
>> [ 1, 4, 4, 1 ]
딕셔너리 a에 있는 밸류값으로만 이루어진 리스트가 출력됨.

.items() : key, value 쌍으로 얻기!
a.items()
>> dict_items([('m', 1), ('i', 4), ('s', 4), ('p', 1)])
키와 밸류의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려줍니다.

.clear() : 딕셔너리 안의 모든 요소 삭제
a.clear()

in : 해당 key가 딕셔너리 안에 있는지 조사하기
'm' in a
>> True

'a' in a
>> False