처음 쓴 코드
str = input()
size = len(str)
cnt = [0 for i in range(size)] # 입력 받은 문자열의 size 만큼 배열 선언 (카운팅을 위해)
for i in range(size):
for j in range(i+1, size):
if str[i] == str[j]: # 이중 포문으로 문자열 서로서로 비교
cnt[i] += 1 # 같은 문자열이 나오면 cnt 배열을 + 해준다.
for i in range(len(cnt)):
if cnt[i] == cnt[i+1]:
print('?')
exit()
m = max(cnt)
if m == 1:
print(str.upper())
else:
print(str[m].upper())
사실 알고리즘 시간에 kmp, 실패함수 등을 배웠으나,, 직접 구현하기 어려웠고
일단 브론즈 문제를 해결하는 데에 있어서는 대단한 알고리즘 보다 내가 어떻게 논리적으로 생각을 할 수 있냐가 더 중요한 것같아서
알고리즘 이론에 끼워맞춘 풀이보다는 혼자만의 생각으로 풀었다.
근데 시간 초과,,,, ㅠㅠ
조건을 충족하기 위해 하나하나씩 코드를 추가하다 보니까 시간 초과가 난 것같다.
<해결 방법>
1. 알파벳 소문자, 대문자 구별을 하지 않으니 나중에 upper을 처리해주기 보다는 처음부터 모두 대문자 처리를 해주었다.
(어차피 출력도 대문자니까)
2. 입력 받은 문자열에서 중복을 제거한 집합을 하나 더 생성해준다. 이때 집합은 list형으로 변환을 해주어야 한다.
왜냐하면 set 형은 순서가 없기 때문에 인덱싱이 불가능하다. 따라서 다음과 같이 선언해준다.
new_str = list(set(str))
중복을 없앤 이유는 중복을 없앤 문자열 집합과 입력 받은 문자열을 비교해서, 집합에 해당하는 원소가 몇번 나왔는지
count 해주기 위해서다. 여기서 큰 값을 찾으면, 가장 많이 등장한 단어가되기 때문에, 정답을 찾을 수 있다.
하지만 문제의 조건 중에 가장 많이 등장한 단어가 2개 이상이라면 '?'를 출력하라고 해서 문제 해결이 조금 더 까다로워진다.
for i in range(len(set_str)) :
cnt.append(str.count(set_str[i]))
이 반복문은 중복을 없앤 list의 길이 만큼 문자열과 set_str을 비교하여,
set_str에 존재하는 원소가 str에 몇개가 포함되어 있는지 카운트 한다.
'Mississipi'를 입력하면 다음과 같은 구조로 반복문이 실행된다.
어떤 문자가 몇 번 포함되었는지 세어줬으니, 여기서 최댓값만 찾으면 문자열에서 가장 많이 쓰인 문자를 찾을 수 있다.
이때 최댓값이 2개(?) 이상인 경우를 처리해줘야 하니까 다음과 같이 조건문을 작성해준다.
if cnt.count(max(cnt)) >= 2:
print('?')
else:
print(set_str[cnt.index(max(cnt))])
else문의 print 함수 내용은 set_str 리스트에서 cnt의 가장 큰 값에 해당하는 인덱스에 있는 값을 cnt 배열에서 반환하는 것이다.
참고자료
최대한 기존의 코드를 살리려고 했으나,, 결국 참고를 햇다ㅠ.ㅠ
여러 자료를 보고 나랑 풀이가 가장 비슷한 분의 코드를 참고했다.
깨달은 점
파이썬에 존재하는 다양한 함수를 사용하는 것이 익숙치 않다.
다양한 코드를 구현하면서 파이썬 내에 존재하는 함수들을 많이 사용해봐야겠다.
index나 set이나 다 알고 있었던 내용이었는데 활용법을 몰랐던 것이다..!
공부를 할 때는 input만 중요한 게 아니라 output이 무엇보다 중요하니까
이를 의식하면서 코드를 짜봐야겠다.
+ 아직 아는 함수도 몇 개되지 않으니,,,, 많이 부딪혀보면서 익히고, 배우자...
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/1874] 스택 수열 (0) | 2022.12.22 |
---|---|
[백준/14912] 숫자 빈도수 (0) | 2022.12.21 |
[백준/2420] 사파리월드 (0) | 2022.12.18 |
[백준/1001] A-B (0) | 2022.12.18 |
[백준/10171] 고양이 (0) | 2022.12.17 |