[1. 문제 재정의 및 추상화]
- 알파벳 대소문자로 구성된 단어가 주어짐
- 이 단어에서 대소문자 구분 없이 가장 많이 사용된 알파벳을 찾아야 함
- 주어지는 단어의 최대 길이는 1,000,000
- 가장 많이 사용된 알파벳을 대문자로 출력해야 함
단, 가장 많이 사용된 알파벳이 여러개인 경우 ? 를 출력해야 함.
[2. 해결 계획]
- 입력의 최대 길이가 1M 이므로 GO 언어를 기준으로 단순히 fmt.Scanf 를 사용하는 것이 시간초과를 유발 할 수 있음.
- bufio 를 이용해서 io 시간을 단축해야 함.
- 각 알파벳의 사용 빈도수를 정렬해서 max 가 여러개인 경우를 확인해야 함.
[3. 계획 검증]
[4. 구현]
package main
import (
"bufio"
"bytes"
"fmt"
"os"
)
func main() {
// bufio 를 이용해서 IO 속도 향상
r := bufio.NewReader(os.Stdin)
str := ""
// C에서 scanf 와 달리 go 에서는 개행까지 읽으므로,
// 개행은 버려지도록 함.
fmt.Fscanf(r, "%s\n", &str)
byteStr := []byte(str)
// 모든 문자를 대문자로 변경
byteStr = bytes.ToUpper(byteStr)
maxCount := 0
table := [255]int{}
chs := []byte{}
for _, v := range byteStr {
// 알파벳 별 사용 빈도수 계산
table[v] += 1
}
for ch := 'A'; ch <= 'Z'; ch++ {
if table[ch] >= maxCount {
// 알파벳 사용 빈도가 max 인 경우
// 기존에 저장 된 slice 를 reset
if table[ch] > maxCount {
chs = []byte{}
}
maxCount = table[ch]
// 알파벳 사용 빈도수의 max 가 같은 경우
// 같이 slice 에 저장
chs = append(chs, byte(ch))
}
}
if len(chs) > 1 {
chs[0] = '?'
}
fmt.Printf("%c\n", chs[0])
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[1021]. 회전하는 큐 (0) | 2022.08.22 |
---|---|
[1316] 그룹 단어 체커 (0) | 2022.02.05 |
[2941] 크로아티아 알파벳 (0) | 2022.02.05 |
[1065] 한수 (0) | 2022.02.05 |
[4673] 셀프 넘버 (0) | 2022.02.05 |