백준#1157
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입출력 규칙
1. 입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
2. 출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
문제 접근
1. 단어의 길이가 1,000,000까지 주어지기 때문에 효율적인 코드작성이 필요하다.
1-1. sys를 import하고, set을 활용하여 중복되는 단어를 없애는 것이 필요하겠다.
2. 알파벳 출력은 대문자로 해야하기 때문에 upper() 메소드를 이용한다.
3. 입력값을 set을 통해 중복을 없애고, 그 결과를 변수에 저장한다.
4. 3에서 만든 set을 반복문을 통해 요소를 하나씩 꺼내고, 최초 입력값을 담은 변수를 .count해서 각 알파벳이 몇개인지 센다. 그리고 그 결과를 cnt 변수에 저장한다.
5. cnt를 빈 배열을 가지고 있는 변수에 추가해준다. 그러면 각 알파벳의 빈도가 수로 저장된 리스트를 담은 배열이 생성된다. 빈 배열에 cnt를 추가했기 때문에.
6. 위 배열의 최대값의 개수를 count 하고, 그것이 1 이상이라면 이는 최대 빈도를 가진 알파벳이 1개 초과라는 뜻이기 때문에 문제 조건대로 '?'을 반환해준다.
7. 6의 조건을 통과한 경우, 5의 배열에서 최대값을 가진 index가 몇번째인지를 찾는 변수를 반든다.
8. 3의 set에서 7의 index번호를 출력하면 그것이 최대 빈도를 가진 알파벳이다.
코드
import sys word = sys.stdin.readline().rstrip().upper() cnt_list = [] unique_word = list(set(word)) for i in unique_word: cnt = word.count(i) cnt_list.append(cnt) if cnt_list.count(max(cnt_list)) > 1: print("?") else: max_word = cnt_list.index(max(cnt_list)) print(unique_word[max_word])