본문 바로가기
CS/Go

[Go언어] 중복 줄 찾기 프로그램, 입/출력에 활용하는 bufio 패키지

by Warehaus 2023. 5. 18.

사진: UnsplashSergi Kabrera

 

 

오늘은 stdin 으로 입력을 받아

중복되는 입력의 카운트를 출력해 주는 프로그램을 작성하였습니다.

 

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	counts := make(map[string]int)
	input := bufio.NewScanner(os.Stdin)
	for input.Scan() {
		counts[input.Text()]++
		if input.Text() == "" {
			break
		}
	}

	for line, n := range counts {
		if n > 1 {
			fmt.Printf("%d\t%s\n", n, line)
		}
	}
}

 

 

코드를 보면서 설명을 드리자면

우선 표준입출력을 받아오기 위해서 bufio 패키지를 사용하였습니다.

bufio에 대한 자세한 내용은 아래를 참고하셔도 좋을 것 같습니다.

 

https://pkg.go.dev/bufio#Scanner.Scan

 

bufio package - bufio - Go Packages

The simplest use of a Scanner, to read standard input as a set of lines. package main import ( "bufio" "fmt" "os" ) func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) // Println will add back the final '\n'

pkg.go.dev

반응형

bufio 패키지를 통해 입력되는 데이터를 counts 맵의 키로 사용하여 카운트를 하나씩 올려 줍니다.

 

같은 입력이 들어오면 해당 key의 value 가 1 씩 증가하도록 작성한 코드입니다.

 

for input.Scan() 구문으로 시작하는 루프에서

입력이 empty ( "" ) 인 경우에 해당 루프를 탈출하도록 작성하였습니다.

 

stdin으로 터미널에서 입력을 하다가

아무 값도 입력을 하지 않으면

그 동안 입력 된 값들 중 중복 된 데이터의 카운트를 출력하는 프로그램이 되겠습니다.

 

실제 실행 예시는 다음을 참고하시죠.

 

> ./dup1
123
123
321
321
123321
3323
a
b
c
abcde
ab
b

2       321
2       b
2       123

 

아래 출력을 보면 두번 이상 반복 된 stdin 을 반복 카운트와 함께 출력해주는 것을 보실 수 있습니다.

이번에는 그저 터미널에서 입력되는 stdin값 이었지만, 다음에는 파일로도 이런 중복체크 프로그램을 만들어 보도록 하겠습니다.

 

 

감사합니다.

 

 

wh.