개발 공부/알고리즘 문제풀이

[백준] 1157. 단어 공부

5묘 2022. 7. 19. 00:00
 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net


이 문제는 알파벳 대문자와 소문자 아스키 코드를 모두 활용해야 하는 문제였다.
이 부분만 알고 푼다면, 저번에 푼 10809번 알파벳 찾기 문제와 비슷하게 풀 수 있었다.

#1157 단어 공부

# 우선, 대문자 A의 아스키코드는 65, 소문자 a의 아스키코드는 97이다.
# 즉 대문자 아스키코드에 32를 더해주면 소문자가 되는 것이다.
# 대, 소문자 상관 없이 가장 많이 사용되는 알파벳이므로 
# 알파벳 언급 횟수를 셀 배열은 26개의 공간을 가진 한개의 리스트만 있으면 충분하다.

arr = [0 for _ in range(26)]
word = input()

# 10809번 알파벳 찾기 문제처럼 word를 반복문을 돌리며 해당하는 인덱스의 값을 +1 해주면 된다.
# 여기서 중요한 것은, 소문자는 97을 빼줬지만, 대문자의 경우 65를 빼줘야 한다.
# (예: 소문자 'a'는 arr[ord('a') - 97], 'A'는 arr[ord('A') - 65] 위치에 넣어야 
# 대소문자 상관 없이 arr[0]의 횟수가 올라간다.

for w in word:
    # 97 <= ord(w) <= 122 이면 소문자
    # 65 <= ord(w) <= 90 이면 대문자
    if 97 <= ord(w) and ord(w) <= 122:
        arr[ord(w) - 97] += 1
    elif 65 <= ord(w) and ord(w) <= 90:
        arr[ord(w) - 65] += 1

# 이제 arr에 들어간 횟수 중 가장 많은 횟수를 가진 알파벳을 구하자.
# 만약 가장 큰 값이 2개라면 '?'을 출력해줘야 한다.
# 그래서 만약 최대값과 같은 값이 나오면 cnt를 1 더해주도록 하고,
# 만약 현재의 최대값보다 큰 값을 만나면 cnt를 1로 초기화해주도록 했다.

max_num = 0
max_idx = 0
cnt = 0
for n in range(len(arr)):
    if arr[n] > max_num:
        max_num = arr[n]
        max_idx = n
        cnt = 1
    elif arr[n] == max_num:
        cnt += 1

# 배열을 다 돈 후, cnt가 1보다 크다면, 즉 최댓값이 여러개라면 ?을 출력한다.
# cnt가 1보다 작거나 같다면(어차피 1보다 작을 수는 없다.) 
# 해당 인덱스에 65을 더해서 대문자로 출력한다.

if cnt > 1:
    print('?')
else:
    print(chr(max_idx + 65))

'개발 공부 > 알고리즘 문제풀이' 카테고리의 다른 글

[백준] 2908. 상수  (0) 2022.07.19
[백준] 1152. 단어의 개수  (0) 2022.07.19
[백준] 2675. 문자열 반복  (0) 2022.07.18
[백준] 10809. 알파벳 찾기  (0) 2022.07.18
[백준] 11720. 숫자의 합  (0) 2022.07.18