정답 코드:
Text = input().upper()
A = list(set(Text))
lst = []
for x in A:
lst.append(Text.count(x))
if lst.count(max(lst)) > 1:
print('?')
else:
print(A[lst.index(max(lst))])
코드 풀이:
우선 3시간을 붙잡은 문제다..
사실 알고리즘 자체는 푸는 데 얼마 안걸렸는데
정답을 제출할 때마다 계속 시간 초과가 떠서
여러 블로그들을 봤었는데,
뭔가 처음 코딩한 내용들이 비효율적이어서 정답처리가 안됐다고
생각했고, 블로그에 코드 그대로 풀고 싶진 않아서
정말 많은 시도를 한 문제다.
우선 여러 참고 자료를 보며 for문을 여러번 사용할 경우
성능이 안좋아진다는 걸 알았고, for문을 필요할 때만 쓰고
문제를 해결하는데 집중하였다.
우선 여기선 파이썬 문자열 메소드들이 여러개 나와서, 유용하게 공부해볼 수 있는
문제여서 잘 짚고 넘어간다면 큰 도움이 될 것 같다!
.upper()메소드는 앞에 오는 영어 word들을 모두 대문자로 바꿔주는 메소드이다.
문제에서 대,소문자를 구분하지 않는 게 조건이었기에 사용해주었다.
그 다음 입력받은 Text를 set(집합) 에 넣어서, 중복 단어들을 지워준 뒤
A 배열에 추가 시켰고
빈 배열 lst를 만들었다.
그 뒤 for문을 통해 A배열에 값들을 차례대로 lst 배열에 추가 시켜줬는데,
count() 메소드를 통해서 Text에 const(x) => x의 값이 얼마나 있는가?를
int로 받게 된다. 예를 들어 A 배열에 예제중 하나인 zZa를 넣으면,
Text = ZZA 고 Text.count(Z) 는 2가 된다. ( index[0],index[1])
그럼 lst에는 [2, 1 ] 이 들어가게 된다.
그 다음엔 조건문을 통해 문제에서 요구한 조건들을 적용하였는데,
if lst.count(max(lst)) > 1: = > ? 를 프린트 해라는.
lst안에 lst의 최댓값이 1개보다 많으면 ?를 출력하라는 뜻이고,
예제인 Mississipi 처럼 s,i의 수가 같을 경우
lst = [ 1,4,1,4] 이런식으로 배열이 되기에, 최댓값 4가 2번 들어갈 경우
?를 출력하게 된다.
그 뒤 else를 통해
print(A[lst.index(max(lst))]) 로 최댓값을 가진 문자를 출력시켰는데,
예를 들어서 해석 해보면 A배열에 최댓값이 있는 인덱스를 출력해라! 기 때문에
Text = [ABBCCCDDDD] 일 경우
A = [A,B,C,D] 고, lst = [1,2,3,4]이 되기에
가장 많이 쓰인 D를 출력할 때 lst에 최댓값이 있는 인덱스를 A에 적용해서 A[4]가 나온다! 시간 초과 때문에 어려웠지만 보람 찬 문제였다!