[백준 1157번-파이썬/Python] 단어공부
알고리즘 공부/BOJ백준 풀이

[백준 1157번-파이썬/Python] 단어공부

http://acmicpc.net/problem/1157

{코드}

words = input().upper()
word_list = list(set(words))
word_count = [words.count(c) for c in word_list]
if(word_count.count(max(word_count)) > 1):
    print('?')
else:
    print(word_list[(word_count.index(max(word_count)))])

{설명}

이 문제를 푸는 하나의 방법은 각 문자 별로(대소문자 구분 없이) 개수를 저장해서 만약 최댓값이 2개 이상이라면?를 출력하고 아니라면 최댓값을 가진 문자를 출력하면 됩니다.

이를 위해 집합과 count함수를 사용합니다.

  • 먼저 문자열을 입력받고 대문자로 바꿔줍니다.(upper함수)

  • 그리고 문자열을 집합으로 만들 것(중복 없애기)을 리스트로 만들어줍니다. - word_list

  • 위의 리스트를 통해 각 문자의 갯수를 저장합니다. - word_count (word_count와 word_list는 같은 인덱스를 가진다고 봅니다)

  • 그러면 문자의 갯수의 최댓값이 1개보다 많으면?를 출력합니다

  • 아니라면 최댓값의 word_count에서의 인덱스를 가져와 그 인덱스에 해당하는 word_list의 값을 출력합니다.

{코드}

from collections import Counter
word = input().upper()
word_count = Counter(input())
if list(word_count.values()).count(max(word_count.values())) > 1:
    print('?')
else:
    for k, v in word_count.items():
        if v == max(word_count.values()):
            print(k)
            break

{설명}

파이썬의 기본 모듈 중 collections에는 Counter라는 클래스가 있는데 이는 말 그대로 인자로 받은 이터러블(iterable)에서 각 인덱스 별로 개수를 딕셔너리 형태로 반환합니다.

이때 키는 인덱스-즉, 이 경우에는 각 알파벳들이 되고, 값은 갯수가 됩니다.

  • 먼저 문자열을 받고 대문자로 바꿔줍니다. (upper함수)

  • 그리고 위의 문자열을 Counter로 만들어줍니다. - word_count

  • 그리고 word_count의 최댓값이 1개 초과인지 확인합니다. - list(word_count.values())는 위의 word_list와 같습니다.

    • word_count.values()를 쓰는 이유는 딕셔너리에서 키를 제외한 값만 받아야 하기 때문입니다.

  • 만약 최댓값의 갯수가 1보다 많으면 ?를 출력하고 아니면 최댓값에 해당하는 키값을 출력합니다.

    • items함수는 키와 값을 이터러블 형태로 만든다.

    • 즉, 최댓값과 같은 값을 가진 키가 답이다.