본문 바로가기

알고리즘/Baekjoon

[1157] 단어 공부

[1. 문제 재정의 및 추상화]

  1. 알파벳 대소문자로 구성된 단어가 주어짐
  2. 이 단어에서 대소문자 구분 없이 가장 많이 사용된 알파벳을 찾아야 함
  3. 주어지는 단어의 최대 길이는 1,000,000
  4. 가장 많이 사용된 알파벳을 대문자로 출력해야 함
    단, 가장 많이 사용된 알파벳이 여러개인 경우 ? 를 출력해야 함.

 

[2. 해결 계획]

  1. 입력의 최대 길이가 1M 이므로 GO 언어를 기준으로 단순히 fmt.Scanf 를 사용하는 것이 시간초과를 유발 할 수 있음.
  2. bufio 를 이용해서 io 시간을 단축해야 함.
  3. 각 알파벳의 사용 빈도수를 정렬해서 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