Menu
Coddy logo textTech

요약 - 단어 빈도수 계산기

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 30번째.

challenge icon

챌린지

쉬움

문서에서 단어 빈도를 세는 텍스트 분석 도구를 만드세요. 이 과제에서는 각 고유 단어가 텍스트에 몇 번 appear하는지 추적하여 데이터를 집계할 때 map이 얼마나 뛰어난지 보여 줍니다.

두 개의 입력을 받습니다:

  • 분석할 텍스트를 나타내는 문자열 (예: "the quick brown fox jumps over the lazy dog the fox is quick")
  • 최소 빈도 임계값을 나타내는 문자열 (예: "2")

중요: 입력 텍스트에는 spaces가 포함될 수 있으므로 bufio.NewReaderReadString('\n')을 사용하거나 bufio.Scanner를 사용하여 전체 line을 읽어야 합니다. 텍스트 입력에 fmt.Scanln을 사용하지 마세요. 첫 번째 공백에서 읽기를 멈추기 때문입니다.

해야 할 작업은 다음과 같습니다:

  1. countWords라는 function을 Create하세요. 이 function은 텍스트 문자열을 입력으로 받고 map[string]int을 returns합니다.
    • 키는 개별 단어(문자열)입니다.
    • 값은 각 단어의 빈도 Count(정수)입니다.
  2. strings.Fields를 사용하여 입력 텍스트를 개별 단어로 split하세요. 이 function은 모든 공백을 기준으로 split합니다.
  3. 텍스트에서 각 단어의 빈도를 Count하세요:
    • 일관된 Count를 위해 모든 단어를 소문자로 Convert하세요.
    • 각 단어에 대해 map의 Count를 1 증가시키세요.
    • 아직 map에 단어가 없으면 0에서 시작하여 1로 증가합니다.
  4. 결과를 Filter하여 threshold 이상 appear하는 단어만 표시하세요.
  5. 다음 형식으로 결과를 Display하세요:
    • 헤더: "Word Frequency Analysis:"
    • 각 조건을 충족하는 단어: "[word]: [count]"
    • 단어는 alphabetical 순서로 Display하세요.
  6. 요약 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 컴파일러