Coding_TEST

[Baekjoon 1157] 단어 공부 (python)

Jerry_JH 2021. 6. 11. 14:08
728x90

문제 공유: https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

[문제 설명]

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

 

[제한사항]

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

[입출력 예]

  입력 출력
예제1 Mississipi ?
예제2 zZa Z
예제3 z Z
예제4 baaa A

[입출력 예 설명]

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는?를 출력한다.

 

예제 1 : i가 4번 s가 4번 사용되어 ?가 출력


[풀이 설명]

이번에는 함수식으로 만들어보았다.

def baekjoon():
    count={}
    lists = list(input().upper())
    for i in lists:
        try: count[i] +=1
        except: count[i] = 1
    word_number=0
    for key,value in count.items():
        if max(count.values()) ==value:
            m_word = key
            word_number+=1
        if word_number == 2:
            return print('?')
    return print(m_word)   
      
baekjoon()

[변수 소개]

count = 문자들의 개수가 저장되어 있는 딕셔너리

lists = 문자열을 입력받아 한 글자씩 저장되어 있는 리스트

word_number = ?를 출력하기 위해 제일 많은 문자가 중복되는 것을 처리하기 위한 변수

m_word = 가장 많이 사용된 알파벳을 저장

 

[풀이]

1) 어차피 출력은 대문자로 해야 되기에 모든 문자를 upper()를 이용해 대문자로 바꿔서 한 글자씩 lists에 저장한다.

2) 첫번째 for문으로 딕셔너리를 통해 중복된 문자들의 수를 정리한다.

예제 1) Mississipi 입력

count(딕셔너리) = {'M' : 1, 'I' : 4, 'S' : 4, 'P': 1}

3) 두번째 for문으로 딕셔너리의 값들을 하나씩 돈다.

4) max(count.values())로 제일 많이 사용된 문자의 개수를 구하고 같으면 그 문자를 m_word에 저장한다.

4-1) 그리고 저장되어 있기에 word_number +1을 하여 1개가 저장되었다고 말한다.

5) 만약 많은 문자가 여러개 있으면 word_number는 또 +1을 하여 2가 될 것이다. 

그러면 ? 출력하고 종료시킨다.

6) 없으면 제일 많은 문자를 출력시키고 종료시킨다.

 


코드가 상당히 길어서 풀이를 할 때 어떻게 하면 줄일 수 있을지 많이 고민을 한 것 같다.

최대한 코드를 줄이려고 노력을 하였고, ?를 출력하기 위해 여러 고민을 하며 검색을 열심히 했는데,  방법을 못 찾았다.

결국 변수를 추가해서 더러운 코드가 되어버렸다.  

확실히 아직은 부족한 점이 많아 보여 기본기부터 탄탄히 하는 것이 중요하다는 것을 느꼈다.

728x90