일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 구현
- LIS
- 프로그래머스
- 알고리즘
- Python
- 문자열
- 새벽코딩
- 완전탐색
- dfs
- BufferedReader
- 다이나믹프로그래밍
- 탐색
- 스택
- SQL
- 백트래킹
- oracle
- Stack
- 다리 만들기
- BFS
- 시뮬레이션
- 브루트포스
- Queue
- HashMap
- 아스키코드
- 백준
- 그리디
- DP
- 빅데이터
- Java
- 배열
- Today
- Total
새벽코딩
[백준] [1157] 단어공부 본문
문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
#단어공부
import sys
# 문자열 입력
S = sys.stdin.readline()
# 각 알파벳의 개수를 담을 리스트 (A~Z) 중복은 없기에
lst = [0 for i in range(27)]
for i in range(len(S)-1):
n = int(ord(S[i])) # ord는 아스키 코드 변환
if n > 90 :
n -= 97
else:
n -= 65
lst[n] += 1 # 해당 알파벳 인덱스 1씩 증가
# 해당 리스트에서 가장 큰 값과 인덱스를 동시에 구하는 방법
bigIndex = 0
bigValue = 0
for i in range(len(lst)):
if lst[i] > bigValue: # 더 큰 값이 있을때마다 최댓값 갱신
bigValue = lst[i]
bigIndex = i
lst.sort(reverse=True) # 플래그를 줘서 해도 된다
if lst[0] == lst[1]:
print('?')
else:
print(chr(bigIndex+65))
A == a 라고 했을 때 A의 아스키 코드는 65 a의 아스키 코드는 97이므로 32차이가 난다.
A~Z의 아스키 값이 65~90 이므로 코드로 변환한 값이 90보다 크다면 32를 빼주면 같아진다.
즉, 대문자는 65를 빼고 소문자는 65에 추가로 32를 빼서 인덱스 값을 증가시켜 주었다.
해당 소스에서는 배열 0~25에 해당 아스키 코드값을 담아주기위해서 추가로 65를 빼서 인덱스 값을 증가시켰다.
즉, A라는 값이 들어왔다면 arr[ord("A")-65] == arr[0]이라고 할 수 있고, 해당 값이 들어왔을때 0번째 값을 1씩증가 시켜주었다. 만약 "AAA"라면 arr[0] = 3의 값이 들어가 있을 수 있다.
인풋 값이 "Mississipi"라면 arr배열에는 다음과 같이 값이 들어올 수 있다.
[0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0]
[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z] 와 대응되는 값이며, 알파벳의 개수가 담겨있다.
여기서 최댓값이 두개이상 존재할 경우 "?"를 출력해야하는데 최댓값을 구하고 그 원소의 개수를 세는 방법이 있고, 정렬해서 맨 앞이나 맨 뒤의 앞뒤 값을 보면 된다. 여기서는 후자를 선택했다.
배열안에서 최댓값과 해당 최댓값의 인덱스를 구하는 방법은 꽤 정형화 되어져 있다.
리스트 내부의 원소값보다 작은 값을 변수에 초기화 해 놓고 리스트 0번째 부터 끝까지 돌면서 값을 비교하고 더 큰값이 있다면 앞의 변수에 그 값을 담으면서 진행하면 된다.
'알고리즘' 카테고리의 다른 글
[백준] [1259] 팰린드롬수 (0) | 2022.11.14 |
---|---|
[백준] [1541] 잃어버린 괄호 (0) | 2022.11.14 |
[백준] [1110] 더하기 사이클 (0) | 2022.10.14 |
[백준] [10951] A+B - 4 (0) | 2022.10.14 |
[백준] [10952] A+B - 5 (0) | 2022.10.14 |