생각하는 아져씨

[BOJ] 1157번 - 단어공부 본문

Study/Algorithm

[BOJ] 1157번 - 단어공부

azeomi 2023. 3. 25. 00:31

단어공부

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

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

www.acmicpc.net

 

 

1157번: 단어 공부

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

www.acmicpc.net

문제 정의


알파벳 대소문자로 된 단어가 주어지면, 가장 많이 사용된 알파벳을 ‘대문자’로 출력하는 문제이다.

만약 가장 많이 사용된 알파벳이 여러개 존재하는 경우에는 “?”를 출력한다.

 

 

접근 방법


구현과 문자열 문제이다.

문제 그대로 구현할 수 있는 간단한 문제였다.

하지만 파이썬 문자열을 잘 다룰 수 있으면 더 간결하고 빨리 풀 수 있는 문제이다.

 

 

문제 해설


  • 대문자로 출력해야 하니 입력받은 알파벳을 대문자로 먼저 처리한다.
  • 각 알파벳이 얼만큼 등장했는지 count 한다.
  • 가장 많이 등장한 단어의 등장 횟수를 확인하고, 똑같이 등장한 다른 알파벳이 있는지 개수를 확인한다.
  • 개수가 1개라면 많이 등장한 알파벳을, 아니라면 ?(물음표)를 출력한다.
  • 이 때 key-value를 한번 뒤집어주면 더 쉽게 value에 대한 key 값을 구할 수 있다.

알아야 하는 메서드

  • dict.values() : 딕셔너리의 value를 모아놓은 리스트
  • dict.keys(): 딕셔너리의 key를 모아놓은 리스트
  • dict.items(): 딕셔너리의 item들을 모아놓은 리스트
  • [v:k for k, v in dict.items()] : 딕셔너리의 key-value를 바꾸는 코드
  • upper(): 문자열 대문자로

 

 

풀이


# 가장 많이 사용된 알파벳 출력 (대문자로)
# 대문자, 소문자 구분 하지 않음.
# 여러개 존재할 경우 ? 출력

text = input()  # 입력 알파벳
alpha_dict = {}  # 알파벳 등장 횟수 저장 딕셔너리

for s in text.upper():
    if s not in alpha_dict:
        alpha_dict[s] = 1
    else:
        alpha_dict[s] += 1

count = 0   # max 알파벳이 몇 개 있는지 확인하는 변수
max_alpha = max(alpha_dict.values())    # 딕셔너리에서 max 값 확인

for a in alpha_dict.values():
    if a == max_alpha:  # max 값인 것을 찾고 count 변수 +1
        count += 1

# key-value 뒤집기: value로 부터 key를 찾으면 순회해야 하므로 간단하게 키-값 을 뒤짚고 get함수로 가져온다.
reverse_dict = {v:k for k, v in alpha_dict.items()}

if count == 1:
    print(reverse_dict.get(max_alpha))
else:
    print("?")

 

더 간단한 풀이

  • 다른 사람의 풀이를 봤는데 문자열 함수를 잘 활용한 풀이가 있었다.
  • ord(), chr() 함수를 적절히 활용해 더 간단하게 접근할 수 있다.
  • 문자열을 아스키코드로 변환해 입력받은 text에 A~Z까지 몇번 등장하는지 카운트 한다. (A~Z는 총 26개라 시간 복잡도에도 영향을 끼치지 않는다.)
text = input().upper()  # upper 함수 사용
maxCount = 0
maxAlpha = "?"

for i in range(ord("A"), ord("Z") + 1): # ord 함수 사용
    C = text.count(chr(i))  # chr 함수 , count 함수 사용
    if C > maxCount:
        maxCount = C
        maxAlpha = chr(i)
    elif C == maxCount:
        maxAlpha = "?"
        
print(maxAlpha)
  • ord(): 문자열을 아스키코드로 변환
  • chr(): 아스키코드를 문자열로 변환

 

 

정리


아주 간단한 문제인만큼 더 간단하게 풀었어야 했다. 문자열을 잘 다룬다고 생각했지만 아직도 부족하다.

특히 ord(), chr() 함수는 한번 공부했던 함수인데 활용하지 못했다.

파이썬 문자열, 특히 알파벳과 관련된 문제가 나온다면 꼭 활용해보도록 하자!

'Study > Algorithm' 카테고리의 다른 글

[BOJ] 1446번 - 지름길  (0) 2023.03.27
[BOJ] 13458번 - 시험감독  (0) 2023.03.25
[Programmers] 최소직사각형  (0) 2023.03.24
[BOJ] 2979번 - 트럭주차  (0) 2023.03.24
[BOJ] 11724번 - 연결 요소의 개수  (0) 2023.02.16