공부하기/백준

[Python] 백준 풀기 1157 - 단어 공부

XEV 2022. 11. 9. 23:47

파이썬 백준 1157번

브론즈1

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 구현, 문자열

 

 

 

 

 

문제 풀기

주어지는 단어의 길이는 1,000,000 이기 때문에 for loop 을 전체 돌리다가 혹시 시간 초과 걸릴까 싶어 최대한 파이썬 내장 함수를 이용하였다.

주어진 입력 문자를 하나하나 정리해가며 결과 출력을 시행하였다.

 

그 순서는

> 모두 대문자 변환

> 각각 문자 리스트 변환 저장

> set() 함수를 이용하여 중복 제거 및 존재 알파벳만 저장

> 존재 알파벳의 해당 문자와 개수를 2차원 리스트로 저장

> 2차원 리스트를 개수에 대하여 내림차순 정리

> 조건에 따른 결과 return

로 작성하였다.

 

 

> 모두 대문자 변환, 결과 출력을 대문자로 원하고 있어서..

    word_up = word.upper()

 

> 각각 문자 리스트 변환 저장

    word_up_ls = list(word_up)

 

> set() 함수를 이용하여 중복 제거 및 존재 알파벳만 저장

    word_up_ls_set = set(word_up_ls)

 

> 존재 알파벳의 해당 문자와 개수를 2차원 리스트로 저장

    count_ls = []
    for ws in word_up_ls_set:
        count_ls.append([ws, word_up_ls.count(ws)])

 

> 2차원 리스트를 개수에 대하여 내림차순 정리, set() 을 사용하여 순서가 엉망이기에..

    count_ls.sort(key = lambda x: -x[1])

 

> 조건에 따른 결괏값 return

    if len(count_ls) == 1:
        return count_ls[0][0]
    elif count_ls[0][1] == count_ls[1][1] and len(count_ls) > 1:
        return "?"
    else:
        return count_ls[0][0]

 

처음에 하나의 문자에 대해 바로 return 할 수도 있지만 코드의 가독성을 위해 마지막 부분에 모아서 작성하였다.

그리고,  and len(count_ls) > 1 는 이전 len(count_ls) == 1 에서 걸러지는 것이지만 확인 사살하기 위해 적어둠.

 

 

 

 

 

코드 보기

일부러 하나하나 확인하는 작업이 많아 test print 가 많이 끼어들었다.

import sys
inputdata = sys.stdin.readline

def fnCountAlphabet(word_up):
    word_up_ls = list(word_up)
    print(f'word_up_ls:     {word_up_ls}')           # test print
    
    word_up_ls_set = set(word_up_ls)
    print(f'word_up_ls_set: {word_up_ls_set}')           # test print
    
    count_ls = []
    for ws in word_up_ls_set:
        count_ls.append([ws, word_up_ls.count(ws)])
    print(f'count_ls:        {count_ls}')         # test print
    
    count_ls.sort(key = lambda x: -x[1])
    print(f'sorted count_ls: {count_ls}')         # test print
    
    if len(count_ls) == 1:
        return count_ls[0][0]
    elif count_ls[0][1] == count_ls[1][1] and len(count_ls) > 1:
        return "?"
    else:
        return count_ls[0][0]


if __name__ == "__main__":
    word = str(inputdata().strip())
    print(f'word:    {word}')         # test print
    word_up = word.upper()
    print(f'word_up: {word_up}')          # test print
    
    result = fnCountAlphabet(word_up)
    print(result)



# Mississipi


# word:    Mississipi
# word_up: MISSISSIPI

# word_up_ls:     ['M', 'I', 'S', 'S', 'I', 'S', 'S', 'I', 'P', 'I']
# word_up_ls_set: {'P', 'S', 'M', 'I'}

# count_ls:        [['P', 1], ['S', 4], ['M', 1], ['I', 4]]
# sorted count_ls: [['S', 4], ['I', 4], ['P', 1], ['M', 1]]


# ?