문제 설명 👨🏻💻
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
코드 구현 👨🏻💻
- 알고리즘 종류:
- 시간복잡도: O(n)
from collections import Counter
s = list(str(input()).upper())
if len(s) == 1 : #문자열 길이가 1인 경우 그대로 출력
print(s[0])
else: #문자열 길이가 2 이상인 경우
cnt = Counter(s).most_common(2)
if cnt[0][1] == cnt[1][1] :
print("?")
else:
print(cnt[0][0])
풀이 방법 👨🏻💻
- 1차 시도, 최종
from collections import Counter
s = list(str(input()).upper())
if len(s) == 1 : #문자열 길이가 1인 경우 그대로 출력
print(s[0])
else: #Counter()로 가장 빈도수가
cnt = Counter(s).most_common(2)
if cnt[0][1] == cnt[1][1] :
print("?")
else:
print(cnt[0][0])
collection 모듈의 Counter 함수를 사용했는데 그 중에서도 most_common(n)을 이용해 출력값을 판별했다.
collections의 Counter 함수는 어떠한 리스트 요소들에 대한 중복의 수를 나타내는 key,value로 구성된 리스트를 만들어준다. 여기서 key는 원래 리스트의 요소가 중복없이 배정되고, vlaue에는 그 요소에 대한 중복 수가 들어간다.
또한 counter함수 중 most_common(n) 기능을 사용하면 중복의 빈도가 높은 순서로 n번째까지 나타내는 작업을 수행해준다. 이를 이용한다면 문제를 쉽게 풀 수 있다.
다른 사람의 코드(Counter 사용 X) 👨🏻💻
word = input().upper()
#입력값을 set으로 구성해서 중복값을 제거한 리스트 형태로 만듦.
word_nonduplicate = list(set(word))
#빈 리스트를 생성
new_list = []
#중복 문자를 제거한 배열에서 for문을 돌면서
for i in word_nonduplicate :
#입력받은 문자열 내 알파벳 개수를 빈 리스트에 입력
new_list.append(word.count(i))
#if:가장 많이 사용된 알파벳의 개수가 동일한 게 2개 이상일 경우 물음표 출력
if new_list.count(max(new_list)) >= 2 :
print("?")
#else: 알파벳 개수를 담은 리스트(=new_list)에서 가장 갯수가 높은 숫자의 인덱스를 통해 중복이 제거된 문자열의 배열에서 해당 문자가 무엇인지 찾는다.
else :
print(word_nonduplicate[(new_list.index(max(new_list)))])
공부하면서 알게 된 추가 정보 👨🏻💻
Max () 안에서도 Count함수 구현이 가능하다.
from collections import Counter
input = str(input()).upper()
lists=sorted(list(input))
result=max(input,key=lists.count)
print()
내가 풀었던 문제랑은 출력값의 조건이 조금 다르지만 (이 코드는 최대값이 중복일 때, 더 먼저 나왔던 문자를 출력하는 방식.)
max() 함수 내부에서 count를 수행해서 결괏값을 출력해낼 수 있다는 사실을 알았다.
'코테 준비 > BOJ' 카테고리의 다른 글
| 백준 2562번: 최댓값 (0) | 2023.03.24 |
|---|---|
| 백준 2475번: 검증수 (0) | 2023.03.22 |