ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 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'))

     

    1. 접근법 : list에다 알파벳 26개 문자들 자리를 마련해 놓고 각 자리 element들을 0으로 설정, 단어를 한 철자씩 돌면서 일치 알파벳이 나올 때마다 1을 더한다. 그렇게 만들어진 list에 최대값이 하나인지 둘이상인지 검사, 둘 이상이면 ?출력, 하나이면 그 알파벳을 대문자로 출력. 이 로직을 함수로 구현했다.

    2. 함수 버전은 직관적으로 보이지 않는 단점이 있...는게 아니라 내가 복잡하게 짜서 그렇다. 주석을 많이 달아서 설명을 많이 두어야 처음 보는 사람도 이해를 빨리 할 수 있을 것이라느 생각이 들어서, 다음부터는 주석을 친절하게 달 것이다. 

    3. 백준에서는? 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))])
    1. 접근법은 나랑 같다.
    2. 그러나 더욱 간단하고 직관적이고 쉽게 이해가 가능하다.
    3. 짧고 간결하면서도 본질을 찌르려면 이렇게 기본 지식을 능숙하게 써야 가능함을 느낀다.

    댓글

금손이 프론트엔드 개발자가 되고자 오늘도 존버중