본문 바로가기

문제풀이

[백준] 1371번 파이썬 풀이

https://www.acmicpc.net/problem/1371

 

1371번: 가장 많은 글자

첫째 줄부터 글의 문장이 주어진다. 글은 최대 50개의 줄로 이루어져 있고, 각 줄은 최대 50개의 글자로 이루어져 있다. 각 줄에는 공백과 알파벳 소문자만 있다. 문장에 알파벳은 적어도 하나 이

www.acmicpc.net

[문제]

영어에서는 어떤 글자가 다른 글자보다 많이 쓰인다. 예를 들어, 긴 글에서 약 12.31% 글자는 e이다.

어떤 글이 주어졌을 때, 가장 많이 나온 글자를 출력하는 프로그램을 작성하시오.

[입력]

첫째 줄부터 글의 문장이 주어진다. 
글은 최대 50개의 줄로 이루어져 있고, 각 줄은 최대 50개의 글자로 이루어져 있다. 
각 줄에는 공백과 알파벳 소문자만 있다. 문장에 알파벳은 적어도 하나 이상 있다.

[출력]

첫째 줄에 가장 많이 나온 문자를 출력한다. 
여러 개일 경우에는 알파벳 순으로 앞서는 것부터 모두 공백없이 출력한다.

[예제 입력1]

english is a west germanic
language originating in england
and is the first language for
most people in the united
kingdom the united states
canada australia new zealand
ireland and the anglophone
caribbean it is used
extensively as a second
language and as an official
language throughout the world
especially in common wealth
countries and in many
international organizations

[예제 출력1]

a

[예제 입력2]

baekjoon online judge

[예제 출력2]

eno

[예제 입력3]

abc a

[예제 출력3]

a

[예제 입력4]

abc
ab

[예제 출력4]

ab

[예제 입력5]

amanda forsaken bloomer meditated gauging knolls
betas neurons integrative expender commonalities
latins antidotes crutched bandwidths begetting
prompting dog association athenians christian ires
pompousness percolating figured bagatelles bursted
ninth boyfriends longingly muddlers prudence puns
groove deliberators charter collectively yorks
daringly antithesis inaptness aerosol carolinas
payoffs chumps chirps gentler inexpressive morales

[예제 출력5]

e

나의 풀이

from sys import stdin

count_alpha = [0]*26
user_input = stdin.read().replace('\n', '').replace(' ', '')

for i in user_input:
    count_alpha[ord(i)-97] += 1
    
max_number = max(count_alpha)

for i in range(26):
    if count_alpha[i] == max_number:
        print(chr(i+97), end = '')

문장입력, 리스트 확인, count 확인, 결과출력

 

해당 문제는 입력받은 문장중에서 가장 많이 나온 알파벳을 출력해주는 문제이다.

그래서 알파벳 26개의 카운트를 해줄 리스트를 생성해준다.

 

from sys import stdin

count_alpha = [0]*26	#알파벳 카운트 리스트 0으로 초기화 및 생성

user_input = stdin.read().replace('\n', '').replace(' ', '') #문장 입력

 

그 이후 반복문을 통해 입력받은 알파벳을 ord 함수로 아스키코드값으로 변경해준다.

아스키 코드값으로 변경해주면 a는 97이므로, "ord(문자) - 97"을 통해 리스트에 값을 1 추가해준다.

 

for i in user_input:
    count_alpha[ord(i)-97] += 1

 

마지막 단계는 가장 많이 나온 알파벳을 출력해주는 단계이다.

리스트에서 가장 높은 값을 추출해주어 max_number 라는 변수에 대입한다.

그리고 리스트의 길이 (총 26개)만큼 반복문을 통해 최대값과 같다면, chr(문자) 함수를 이용하여 숫자값을 문자로 바꾸어준다. (a는 97이므로 i+97을 해주게 되면 a~z 까지 출력 가능)

 

max_number = max(count_alpha)	#최대값 추출

for i in range(26):
    if count_alpha[i] == max_number:	#만약 리스트[i]가 최대값이라면
        print(chr(i+97), end = '')		#chr함수를 이용하여 문자로 출력

 

input() 대신 stdin.read()를 사용한 이유.

 

테스트 케이스(N)을 입력받는 경우에는 input()을 사용하여도 무방하지만, 여러줄을 입력받는 상황에서는 stdin 을 이용해야 시간초과가 발생하지 않기 때문.

 

 ㅇ sys.stdin.read()

   - 입력값을 한줄마다 나누어 저장하는 방법으로, 여러줄을 입력받을 때 사용하면 유용하다.

   - 단, 여러줄의 문장을 입력받을 때 사용하므로 실행의 종료는 윈도우 기준 Ctrl+z, 맥 기준으로 Ctrl+d를 입력해야 한다.

'문제풀이' 카테고리의 다른 글

[백준] 1408번 파이썬 풀이  (0) 2022.04.01
[백준] 1173번 파이썬 풀이  (0) 2022.04.01
[백준] 1252번 파이썬 풀이  (0) 2022.03.27
[백준] 1159번 파이썬 풀이  (0) 2022.03.23
[백준] 1267번 파이썬 풀이  (0) 2022.03.23