백준 5637번 파이썬 코드 답안

    문제

    단어는 알파벳(a-z, A-Z)과 하이픈(-)으로만 이루어져 있다. 단어와 다른 문자(마침표, 숫자, 심볼, 등등등...)로 이루어진 글이 주어졌을 때, 가장 긴 단어를 구하는 프로그램을 작성하시오.

    Apple의 길이는 5, son-in-law는 10, ACM-ICPC는 8이다.

    입력

    입력은 여러 줄, 문단으로 이루어져 있다. 하지만, 10,000글자를 넘지 않는다. 단어의 길이는 100을 넘지 않는다. E-N-D는 입력의 마지막을 의미한다.

    출력

    가장 긴 단어를 소문자로 출력한다. 가장 긴 단어가 여러개인 경우에는 글에서 가장 먼저 나오는 것을 출력한다.

    문제풀이

    이 문제는 경우를 정확히 나누는 것으로부터 문제 풀이가 시작이 된다. 경우를 먼저 간단히 나누면 다음과 같다. 

    1. 단어는 반드시 알파벳과 '-'으로 만들어져 있다.
    2. 나머지 값은 모두 단어와 상관없는 값이다. 

    여기서 생각할 수 있는 것은 만약 알파벳과 '-'라는 문자가 나오면 단어로 체크를 해서 하나씩 더해가면 되는 것이고, 숫자나 이외의 문자가 나오게 되면 그동안 체크해오던 문자열을 정리하는 식으로 접근을 해야한다는 것이다. 이렇게 생각할 경우 분기점은 꽤나 간단해진다.


    1. 각 문자를 하나씩 체크한다.
    2. 들어온 문자가 문자열이거나 '-'이면 문자열에 값을 붙여준다. (if i.isalpha or i =='-') 
    3. 들어온 문자가 2번에 해당되지 않을 경우, 측정하던 문자열을 정리하고 가치 판단을 한다.
    4. 가치 판단은 이 값이 내가 기억하고 있는 가장 긴 문자보다 더 긴지를 확인한다. (if max_num > len(my_str))
    5. 문장의 행이 바뀔 때, 내가 기록하고 있는 문자열의 마지막 문자가 '-'가 아니라면, 단어 입력이 완료된 것이기 때문에 가치 판단을 한다.

    위의 의사코드가 전반적인 코드의 메인 스트림이 될 것이다. 그렇다면 이제 해결해야하는 부분은 끝이 나는 부분과 끝났을 때, 대문자를 소문자로 어떻게 변환하는 것인지를 결정해야한다.

    먼저 나는 끝내는 법을 내 기준으로는 직관적으로 만들었다. 내가 기억하고 있는 문자열의 길이가 5일 때만, 그 문자열이 'E-N-D'인지 확인하도록 했다. 매번 확인할 경우, 굉장히 코드가 시간이 지체될 수 밖에 없다.

    그렇다면, 어떻게 소문자로 바꾸었을까? 그 방법은 아스키 코드를 활용했다. 아스키 코드를 파이썬 쉘에서 사용해보면 'A'의 아스키 값은 65이고, 'a'의 아스키 값은 '97'이라는 것을 쉽게 알 수 있다. 그리고 '-'는 45라는 것을 쉽게 알 수 있다. 따라서 문자열을 하나씩 출력하는데, 출력할 때 아스키 값이 96보다 아래이면서 45가 아닐 경우네는 항상 32를 더한 값은 출력해주도록 했다. 코드는 아래와 같다.

    import sys
    my_str = ''
    max_str = 0
    answer_str = ''
    while 1 :
        temp = str(sys.stdin.readline().rstrip())
        for i in temp :
            if not i.isalpha() or i.isdigit() :
                if i != '-' :
                    if len(my_str) > max_str :
                        max_str = len(my_str)
                        answer_str = my_str
                    my_str = ''
                elif i == '-' :
                    my_str +=i
            else :
                my_str += i
            if len(my_str) == 5 :
                if my_str == 'E-N-D' :
                    for i in answer_str :
                        if 50<= ord(i) <= 90 :
                            print(chr(ord(i) + 32), end='')
                        elif ord(i) == 45:
                            print(i,end ='')
                        else :
                            print(i,end = '')
                    exit()
        if len(my_str)>0 :
            if my_str[-1] != '-' :
                if len(my_str) > max_str :
                    max_str = len(my_str)
                    answer_str = my_str
                my_str = ''

     

    'CS > BOJ' 카테고리의 다른 글

    백준 2512번 파이썬 코드 답안  (0) 2021.08.01
    백준 1793번 파이썬 코드 답  (0) 2021.07.27
    백준 2399 파이썬 코드 답안  (0) 2021.07.26
    백준 2790번 파이썬 코드 답안  (0) 2021.07.25
    백준 9996번 파이썬 코드 답안  (0) 2021.07.25

    댓글

    Designed by JB FACTORY