최종 제출 코드
S = input().upper()
test = [0]*26
for i in S:
test[ord(i)-65] += 1
value = max(test)
lists = test.copy()
lists.sort(reverse=True)
if lists[0]==lists[1]:
print("?")
else:
print(chr(test.index(value)+65))
a.sort : 오름차순 정렬
a.sort(reverse=True) : 내림차순 정렬
❌ a = b : 이 방식으로 리스트를 복사하게 되면 a나 b 리스트에 변경사항이 발생할 시 다른 쪽에도 반영된다. 객체를 복사한 것이 아니라 객체의 주소를 복사한 것이기 때문이다.
⭕ a = b.copy() : a를 변경해도 b에는 반영되지 않음
⭕ a = b[:] : a를 변경해도 b에는 반영되지 않음
✔ 위의 두 경우는 '얕은 복사'로 a와 b는 다른 객체를 가리키고 있지만 리스트 내부에 존재하는 객체는 같은 객체를 가리키고 있다.
✔ 따라서 리스트 원소가 참조형 변수일 경우 한 쪽 리스트의 원소만 변경해도 다른 쪽의 리스트의 원소도 변경된다.
import copy
a = copy.deepcopy(b)
✔ 위의 경우는 copy 모듈을 이용하여 deepcopy 함수를 호출
✔ 객체의 변형성에 따라서, 불변형 객체는 그대로 가져오고 변형 객체는 새로운 공간에 값을 복사하여 가져오게 된다.
✔ 이 경우 완벽한 복사를 할 수 있지만 변수 생성에 시간이 오래 걸리고 메모리를 많이 사용한다는 단점이 있다.
다른 사람이 작성한 코드
word = input().lower()
word_list = list(set(word))
cnt = []
for i in word_list:
count = word.count(i)
cnt.append(count)
if cnt.count(max(cnt)) >= 2:
print("?")
else:
print(word_list[(cnt.index(max(cnt)))].upper())
리스트에 존재하는 원소에 대해서만 체크
전체 알파벳 개수 만큼 리스트를 만들 필요가 없음
list.count(값) : 리스트 안에 매개변수 값과 동일한 원소의 개수를 반환한다.
[코드 출처]