본문 바로가기
IT/알고리즘

백준 1157 단어 공부 파이썬

by 시작은코딩 2022. 2. 28.
반응형


풀이

word = input().upper()
word_list = list(set(word)) 

cnt = []
for i in word_list:
  cnt.append(word.count(i))

max_cnt = max(cnt)
index_max_cnt = cnt.index(max_cnt)

if cnt.count(max_cnt) > 1:
  print('?')
else:
  print(word_list[index_max_cnt])

 

예제와 같이 Mississipi 를 입력했을 때로 풀이해보자.

 

word = input().upper()

입력 시 Mississipi 는 MISSISSIPI 모두 대문자로 입력된다.

word_list = list(set(word))

word_list 에는 set 함수로 중복값을 제거해준다. 결국 M I S P 가 남는다.

cnt = []
for i in word_list:
  cnt.append(word.count(i))

cnt 배열을 만들어 둔 후,

반복문을 돌린다. 길이는 word_list 만큼 하면 된다. 중복된 단어 모두를 반복할 필요가 없으므로.

cnt에 추가해줄건데, 입력받은 word의 i번째 개수를 받는다.

 

근데 참고로 set 함수는 중복은 제거해주지만 순서는 지마음대로이므로 M I S P 순서대로 나오는건 아님 랜덤임 

 

어쨌든 M 을 받으면 M 이 1개구나 하고 cnt 에 1이 들어가는것.

 

max_cnt = max(cnt)
index_max_cnt = cnt.index(max_cnt)

if cnt.count(max_cnt) > 1:
  print('?')
else:
  print(word_list[index_max_cnt])

굳이 필요없지만 배열 cnt 의 최댓값을 max_cnt 변수에 넣고,

이 최대값이 어느 위치에 있는지 index 함수를 사용하여 찾는다. cnt.index(max_cnt)

 

그리고 최댓값이 동일하게 있으면 안되므로 if문을 작성해주는데,

cnt.count(max_cnt) > 1 이라는 말은 cnt 라는 배열에서 최대값의 개수가 1개 이상이니 ? 라는 물음이다.

 

MISSISSIPI 를 예로 계속 들자면, 

M이 1개, I 4개, S 4개, P 1개 여서, 최댓값 I, S 가 동일하게 4개이다.

최대값이 4인개 2개이니 (1개 이상이니)

출력에서 요구한대로 '?'를 출력한다.

 

그게 아니라면, 

최대값이 위치한 자리의 word_list를 출력해준다.

 

 

 

설명을 적으면서도 여러번 생각해야되는 어려운 문제였다 ..ㅠ

다음에 한번 더 풀어봐야겠다.


오답 풀이

 

리스트 중 최댓값 구하는 법을 찾아보다 딕셔너리로 빠지게 되어 딕셔너리로 풀어보려 했다.

T = list(input())
count = {}

for i in T :
    try: count[i] +=1
    except: count[i] = 1
max_key = max(count, key=count.get)
all_values = count.values()
max_value = max(all_values)

print(count)
print(max_key, max_value)

시도는 좋았던 것 같다.

다만, 내가 그 이후를 어떻게 만드는지 모르는건지 아니면 더 복잡해지는걸지 모르겠지만,

가장 많이 사용된 알파벳이 여러 개 존재하는 경우 ?로 출력하는 부분에서 막혔다.

이것도 딕셔너리로 해결이 가능할까? 모르겠다.

반응형

'IT > 알고리즘' 카테고리의 다른 글

백준 2908 상수  (0) 2022.03.01
백준 1152 단어의 개수 파이썬  (0) 2022.02.28
백준 2675 문자열 반복 파이썬  (0) 2022.02.27
백준 10809 알파벳 찾기 파이썬  (0) 2022.02.25
백준 11720 숫자의 합 파이썬  (0) 2022.02.24