안녕하세요. 지난 포스팅의 BOJ 2675번 : 문자열 반복에서는 문자열 내장함수인 join 함수를 이용해서 문제를 풀어보았습니다. 오늘도 문자열과 관련된 문제를 풀어보도록 하겠습니다.
완벽한 코딩은 존재하지 않습니다. 제가 제출한 코드 역시 마찬가지고 그저 참고만 해주시길 바랍니다.
핵심 포인트
- 문자열 자료형
- lower / upper 함수
제출 코드
S = input().lower()
cnt = [0] * 26
for s in S :
cnt[ord(s) - 97] += 1
if cnt.index(max(cnt)) == 25 or max(cnt[cnt.index(max(cnt)) + 1 : ]) != max(cnt) :
print(chr(cnt.index(max(cnt)) + 65))
else :
print("?")
해설
일단 문제의 입력은 대소문자에 관계없이 문자가 입력됩니다. 그 다음으로 출력은 가장 많이 사용된 영어를 대문자로 출력하는 것입니다. 이때, 대소문자에 관계없이 사용된 알파벳의 개수를 세야하기 때문에 문자열이 입력되면 lower 함수를 이용해서 전부 소문자로 변환시켜주었습니다. 입력된 문자를 전부 대문자로 변환시켜주는 upper 함수를 사용해도 문제는 없습니다만 영어 대문자는 아스키코드의 65번부터 사용되기 때문에 cnt[ord(s) - 65] += 1로 사용해주어야합니다. 이렇게 되면 문자열 내의 알파벳을 하나씩 순회하면서 어떤 알파벳이 몇 번 쓰였는 지 cnt 변수에 저장하게 됩니다.
하지만, 문제 출력의 조건이 가장 많이 쓰인 알파벳이 여러 개라면 "?"를 출력해주어야하기 때문에 이를 조건문으로 처리해주어야합니다. 기본적으로 max 함수를 이용해서 cnt의 최대값을 찾습니다. 다음으로 리스트 내장함수인 index를 이용해서 해당 최대값이 몇 번 인덱스에서 사용되었는지 나왔는 지 확인합니다. 만약, 최대값이 유일하다면 문제는 없겠지만, index 함수는 가장 첫번째로 만나는 값의 인덱스만 반환하기 때문에 중복해서 존재하는 지는 모릅니다. 따라서, cnt.index(max(cnt))의 다음 인덱스부터 마지막 인덱스까지 기존의 최대값과 동일한 값이 있으면 "?"를 출력해주면 됩니다. 그런데 만약, 최대값이 "Z" 문자에서 등장하게 되면 다음 인덱스를 확인할 수 없기 때문에 그냥 cnt.index(max(cnt)) == 25를 통해 마지막 인덱스임이 확인되면 조건문으로 넘어가게 됩니다. 마지막으로 chr 함수를 이용해서 해당 숫자에 65를 더한 값을 ASCII 코드로 변환해주어 출력해주면 됩니다.
참고자료 및 그림출처
'Programming > Coding Problem' 카테고리의 다른 글
BOJ 2908번 : 상수 (0) | 2022.07.01 |
---|---|
BOJ 1152번 : 단어의 개수 (0) | 2022.06.28 |
BOJ 2675번 : 문자열 반복 (0) | 2022.06.26 |
BOJ 10809번 : 알파벳 찾기 (0) | 2022.06.26 |
BOJ 11720번 : 숫자의 합 (0) | 2022.06.26 |