꾸준히 합시다

백준 파이썬 1157번: 단어 공부 본문

코딩 테스트 문제 풀이

백준 파이썬 1157번: 단어 공부

tturbo0824 2021. 3. 11. 01:42

www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

문제 유형: 구현, 문자열

 

# Solution 1 - 정돈되기 전 소스 코드

a = input()
a = a.upper()
new = {}

for i in range(len(a)):
    if a[i] in new:
        new[a[i]] += 1 
    else:
        new[a[i]] = 1

lst = list(new.values())
lst.sort(reverse=True)

if len(new) == 1:
    print(a[0])
elif lst[0] == lst[1]:
    print("?")
else:
    for key, value in new.items():
         if lst[0] == value:
            print(key)

통과는 되었지만 보기에도 정돈이 안 되어있고 쓸모없는 변수를 너무 많이 지정해두었다. 부끄럽지만 count 함수를 몰랐기에 dictionary를 사용해 count 기능을 비슷하게라도 구현시켜 보려고 했다.

 

  1. 만약 new라는 dictionary에 알파벳이 들어있지 않다면 key로 추가해주고 value를 1로 지정한다
  2. 알파벳이 반복해서 등장할 때마다 value에 1을 더해준다. 만약 입력된 단어가 Mississippi라면 new에는 {'M': 1, 'I': 4, 'S': 4, 'P': 2} 로 저장되게 된다.
  3. 이 new dictionary의 value값만으로 이루어진 리스트를 만들어주고 sort()를 이용해 내림차순으로 정렬해준다.
  4. 이 리스트의 길이가 1이라면 한 가지 알파벳만이 등장했다고 간주, 바로 처음 입력 값의 맨 앞 글자 출력한다. (맨 앞글자일 필요는 없고 반복만 피하면 된다. 예: 입력값이 aa일 경우)
  5. 리스트의 길이가 1 이상이고 만약 가장 큰 수가 여러 개 있다면 바로 ?를 출력해준다.
  6. 그렇지 않다면 다시 new dictionary로 돌아가 해당 숫자를 value로 지니는 key값을 출력한다.

 

# Solution 2 - 최종 소스 코드

a = input().upper()
word = list(set(a))
new = []

for i in word:
    count = a.count(i)
    new.append(count)
                    
if new.count(max(new)) >= 2:
    print("?")
else:
    print(word[new.index(max(new))])

 

아래부터 각각 Solution 1과 Solution 2로 제출한 결과.

Comments