ohsory1324   4년 전

터미널에서 333334자를 넣어봐도 입력하자마자 출력이 되는데 문제가 뭘까요? ㅠ

solarmagic   4년 전

입력으로 10이 들어오는걸 생각해보세요

bupjae   4년 전

윗 분의 말씀대로 이 프로그램은 입력에 숫자 0이 포함되어 있을 때 올바른 답을 출력하지 못합니다.

하지만 '시간 초과'의 원인은 다른 곳에 있습니다.

  

golang 의 fmt 패키지의 Scanf 나 Print 등은 buffer 없이 입출력을 합니다.

특히 출력의 경우, 다른 언어에서 한 번 print 할 때 마다 (비싼 연산인) flush 가 같이 발생한다고 생각하면 됩니다.

unbuffered I/O 의 성능은 실행 환경에 따라 많은 차이가 있을 수 있습니다.

이 프로그램을 제 컴퓨터에서 333,334 byte 입력 데이터를 넣고 실행했더니 약 1.8초 정도 걸렸습니다.

  

os.Stdout 를 bufio.NewWriter 로 감싼 뒤, fmt.Print() 대신 out.WriteString() 를 사용하면 더 빠른 출력이 가능합니다.

단, 프로그램을 종료하기 전에 out.Flush() 를 꼭 실행해 주세요.

ohsory1324   4년 전

댓글 달아주셔서 감사합니다~ 두 분 말씀대로 수정해봤는데도 시간초과가 나는데 원인을 모르겠네요 ㅠㅠ bufio.NewWriter 사용 방식이 잘못된걸까요?

bupjae   4년 전

여전히 오류가 난다면 입력 또한 buffered I/O 로 바꿔보세요.

다음 중 한 가지 방법을 사용해 보세요

 

1) os.Stdin 을 bufio.NewReader 로 감싼 다음 fmt.Fscan 을 사용한다

2) 이 문제와 같이 읽어야 할 데이터가 한 덩어리인 경우 io/ioutil.ReadAll() 을 활용하는 것도 한 가지 방법일 수 있습니다.


ohsory1324   4년 전

감사합니다 bupjae님! 입력받는 방식을 바꾸니 해결됐네요 ㅎㅎ

댓글을 작성하려면 로그인해야 합니다.