[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기
일반적으로 PS할 때, 저는 bufio 패키지를 사용합니다. 보통 사용하는 fmt.Scanf()
또는 fmt.Printf()
는 버퍼링을 수행하지 않아 많은 양의 입력을 받는 경우 매우 느려집니다. 실행 시간이 매우 중요한 PS에 있어선 더더욱 피하게 되는 내장 함수입니다.
한 줄에 여러 개의 입력을 받는 경우, (*bufio.Reader).ReadString('\n)
을 이용해 받고, 끝에 들어오는 \n
을 Trim하고 Fields()
를 이용해 배열로 쪼갭니다. 그리고 나서 strconv.Atoi()
로 숫자 변환을 해줍니다.
만약 한 줄에 셀 수 있을 정도의 입력을 받는다면, fmt.Fscanf((*bufio.Reader), "%d %d\n", &X, &Y)
처럼 받을 것입니다. 하지만 Fscanf()
로도 만족스럽지 못한 속도를 맞이한다면 Scanner
사용을 진지하게 고민해볼 필요가 있습니다.
다음과 같이 사용하면 됩니다.
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
var (
w = bufio.NewWriter(os.Stdout)
s = bufio.NewScanner(os.Stdin)
)
func main() {
s.Split(bufio.ScanWords)
N := scan()
X := scan()
fmt.Fprintln(w, N, X)
)
func scan() int {
s.Scan()
n, _ := strconv.Atoi(s.Text())
return n
}
다음에는 Scanner를 활용하는 더 다양한 예제를 공부해볼 생각입니다!
마무리
여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.
혹시라도 글에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊
반응형
'IT > Go' 카테고리의 다른 글
[Go/Golang] 구조체 JSON 변환 시, omitempty가 적용되지 않는 경우 (1) | 2021.05.27 |
---|---|
[Go/Golang] bufio.Scanner를 이용할 때 주의 사항 (0) | 2021.05.22 |
[Go/Golang] Zap과 시간 기반 파일 로테이션 로깅 수행하기 (0) | 2021.03.29 |
[Go/Golang] Go Application에 Prometheus Exporter 연동하기 (2) | 2021.03.16 |
[Go/Golang] Map 자료형을 Struct로 변환하기(mapstructure) (0) | 2021.03.15 |