-
백준 1157번 : 단어공부 [파이썬]항해99_알고리즘 연습 중계 2021. 3. 7. 19:35
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
간단해 보였는데, 무려 밤을 새게 한 문제. 그래도 쪼렙이 끙끙대고 오래 생각하고 시도해보고 결국 해결해 나는 쾌감에다가 list의 메소드들을 확실하게 익혔다는 점에서 대-만족!
1. 내가 짠 코드
def find_alphabet_occurrence_array(string): alphabet_occurrence_array = [0] * 26 string = string.upper() print(string) for char in string: if not char.isalpha(): continue # if의 조건이 참인 부분은 건너뛰고 다음 단계에서 진행 arr_index = ord(char) - ord('A') # print(arr_index) alphabet_occurrence_array[arr_index] += 1 # 상대위치 relative position. max_occurrence = 0 max_alphabet_index = 0 for index in range(len(alphabet_occurrence_array)): if alphabet_occurrence_array[index] > max_occurrence: max_occurrence = alphabet_occurrence_array[index] max_alphabet_index = index print(max_occurrence) print(max_alphabet_index) print() print(alphabet_occurrence_array) print(max_alphabet_index) max_value_in_array = max(alphabet_occurrence_array) print(max_value_in_array) max_value_in_array_cnt = alphabet_occurrence_array.count(max_value_in_array) if max_value_in_array_cnt > 1: max_alphabet = "?" else: max_alphabet = chr(max_alphabet_index + ord('A')).upper() return max_alphabet print(find_alphabet_occurrence_array('This is sparta!')) print() print(find_alphabet_occurrence_array('Mississipi')) print() print(find_alphabet_occurrence_array('oOaaaaegl')) print() print(find_alphabet_occurrence_array('k'))
-
접근법 : list에다 알파벳 26개 문자들 자리를 마련해 놓고 각 자리 element들을 0으로 설정, 단어를 한 철자씩 돌면서 일치 알파벳이 나올 때마다 1을 더한다. 그렇게 만들어진 list에 최대값이 하나인지 둘이상인지 검사, 둘 이상이면 ?출력, 하나이면 그 알파벳을 대문자로 출력. 이 로직을 함수로 구현했다.
-
함수 버전은 직관적으로 보이지 않는 단점이 있...는게 아니라 내가 복잡하게 짜서 그렇다. 주석을 많이 달아서 설명을 많이 두어야 처음 보는 사람도 이해를 빨리 할 수 있을 것이라느 생각이 들어서, 다음부터는 주석을 친절하게 달 것이다.
-
백준에서는? Runtime error 작렬. 왜냐면 백준에서는 이걸 함수가 아닌 형식을 원하니까. 하지만 에디터에서 확인하니 원하는 결과가 제대로 나왔다.
2. 남이 짠 코드
word = input().upper() word_list = list(set(word)) print(word_list) cnt = [] for i in word_list: count = word.count(i) cnt.append(count) print(cnt) if cnt.count(max(cnt)) >= 2: print("?") else: print(word_list[cnt.index(max(cnt))])
- 접근법은 나랑 같다.
- 그러나 더욱 간단하고 직관적이고 쉽게 이해가 가능하다.
- 짧고 간결하면서도 본질을 찌르려면 이렇게 기본 지식을 능숙하게 써야 가능함을 느낀다.
'항해99_알고리즘 연습 중계' 카테고리의 다른 글
백준 2805번 나무 자르기 [파이썬] (0) 2021.03.15 백준 1011번 Fly me to the Alpha Centauri [파이썬] (0) 2021.03.15 백준 4344 코드 : 평균은 넘겠지 [파이썬] (0) 2021.03.06 -