요약 - 단어 빈도수 계산기
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 30번째.
챌린지
쉬움문서에서 단어 빈도를 세는 텍스트 분석 도구를 만드세요. 이 과제에서는 각 고유 단어가 텍스트에 몇 번 appear하는지 추적하여 데이터를 집계할 때 map이 얼마나 뛰어난지 보여 줍니다.
두 개의 입력을 받습니다:
- 분석할 텍스트를 나타내는 문자열 (예:
"the quick brown fox jumps over the lazy dog the fox is quick") - 최소 빈도 임계값을 나타내는 문자열 (예:
"2")
중요: 입력 텍스트에는 spaces가 포함될 수 있으므로 bufio.NewReader와 ReadString('\n')을 사용하거나 bufio.Scanner를 사용하여 전체 line을 읽어야 합니다. 텍스트 입력에 fmt.Scanln을 사용하지 마세요. 첫 번째 공백에서 읽기를 멈추기 때문입니다.
해야 할 작업은 다음과 같습니다:
countWords라는 function을 Create하세요. 이 function은 텍스트 문자열을 입력으로 받고map[string]int을 returns합니다.- 키는 개별 단어(문자열)입니다.
- 값은 각 단어의 빈도 Count(정수)입니다.
strings.Fields를 사용하여 입력 텍스트를 개별 단어로 split하세요. 이 function은 모든 공백을 기준으로 split합니다.- 텍스트에서 각 단어의 빈도를 Count하세요:
- 일관된 Count를 위해 모든 단어를 소문자로 Convert하세요.
- 각 단어에 대해 map의 Count를 1 증가시키세요.
- 아직 map에 단어가 없으면 0에서 시작하여 1로 증가합니다.
- 결과를 Filter하여 threshold 이상 appear하는 단어만 표시하세요.
- 다음 형식으로 결과를 Display하세요:
- 헤더:
"Word Frequency Analysis:" - 각 조건을 충족하는 단어:
"[word]: [count]" - 단어는 alphabetical 순서로 Display하세요.
- 헤더:
- 요약 statistics를 Calculate하고 Display하세요:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"- 여러 단어의 Count가 가장 높은 값으로 같다면, alphabetical 순서에서 먼저 오는 단어를 보고하세요. 모든 단어가 한 번씩만 appear한다면 이는 단순히 정렬된 list의 첫 번째 단어입니다.
예를 들어 입력 텍스트가 "hello hello world"이고 threshold가 "2"라면 출력은 다음과 같아야 합니다:
Word Frequency Analysis: hello: 2 Total unique words: 2 Words above threshold: 1 Most frequent word: hello (2 times)
전체 입력 line을 읽으려면 bufio package를, 텍스트를 split하고 소문자로 Convert하려면 strings package를, threshold 문자열을 integer로 Convert하려면 strconv package를, 단어를 alphabetical 순서로 정렬하려면 sort package를 사용하세요. 이 과제에서는 map이 데이터를 Count하고 집계하는 우아한 solution을 제공하는 방식을 보여 줍니다. 또한 map의 zero-value 동작 덕분에 Count 로직을 간단하고 효율적으로 구현할 수 있습니다.
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// 텍스트의 전체 줄을 읽습니다 (공백 포함)
scanner.Scan()
text := scanner.Text()
// threshold 값을 읽습니다
scanner.Scan()
thresholdStr := scanner.Text()
// threshold를 정수로 변환합니다
threshold, _ := strconv.Atoi(thresholdStr)
// TODO: 아래에 코드를 작성하세요
// 1. map[string]int를 반환하는 countWords 함수를 작성하세요
// Hint: 단어를 분할하고 정규화하려면 strings.Fields와 strings.ToLower를 사용하세요
// 2. Use the function to count word frequencies
// 3. 최소 'threshold'번 나타나는 단어들을 필터링하세요
// 4. 필터링된 단어들을 알파벳순으로 정렬하고 표시하세요
// 5. 요약 통계를 계산하고 표시하세요
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러