IT/Go

[Go/Golang] 정수형 자료를 입력 받을 때, Scanner 사용하기

wookiist 2021. 5. 13. 19:36

[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를 활용하는 더 다양한 예제를 공부해볼 생각입니다!

마무리

여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.

혹시라도 글에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊

반응형