Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 코드트리
- 프로그래머스
- Lora
- bfs/dfs
- 코딩테스트실력진단
- paper review
- 파인튜닝
- LLM
- 데이터분석
- 파이썬
- 스터디
- 판다스
- 알고리즘
- DP
- Study
- 플로이드와샬
- 코딩테스트
- 이분탐색
- Python
- 머신러닝
- 최단경로
- speaking
- Fine-Tuning
- peft
- English
- Scaling Laws
- Generative AI
- 그래프이론
- Coursera
- 완전탐색
Archives
- Today
- Total
생각하는 아져씨
[BOJ] 1157번 - 단어공부 본문
단어공부
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 |