30만개요? 무리 없이 할 거 같습니다..만.
버퍼를 하나 만들어 놓고 출력해 보는 것도 나쁘진 않을 듯 싶네요.
30만개요? 무리 없이 할 거 같습니다..만.
버퍼를 하나 만들어 놓고 출력해 보는 것도 나쁘진 않을 듯 싶네요.
답변 감사드립니다.
무리없이 출력될거라고 말씀해주신거 보면 제가 무언가 잘못 생각하고 있다는 생각이 드네요...
일단 아래와 같은 코드로 printf()를 수행해보면 콘솔에 출력하는데에만 약23초정도가 소요되네요.
Judge 시스템에서도 콘솔과 같은 장치를 이용한다면 똑같지 않을까 싶어서요.
버퍼를 만들어 출력해보라는 말씀을 조금더 구체적으로 설명해주실수 있으신가요? 한번 테스트해보고 싶네요.
감사합니다.
#include <iostream>
#include <cstdio>
#include <time.h>
using namespace std;
int main()
{
int start = clock();
const int max_num = (int)3e5;
for (int i = 0; i < max_num; i++)
{
printf("%d ", i);
}
printf("Elapsed Time : %d ms\n", clock() - start);
return 0;
}
버퍼를 만들어 보라는 건 별 게 없고요.
char buffer[1000000] = {0};
이렇게 만들어 놓고, 버퍼가 차기 직전까지 buffer에 쓴 다음에 출력.
다시 버퍼 시작부터 버퍼가 차기 직전까지 buffer에 쓴 다음 출력..
이런 식입니다.
문자열의 길이만 구할 수 있다면
버퍼에 쓰는 위치만 옮기기만 하면 됩니다.
printf("%s\n",buffer);
이렇게 해도 오래 걸릴려나요??
아래의 코드로 테스트해보면 릴리즈모드에서 약 1600~1900ms 을 왔다갔다하며 출력되네요.
이정도가 최선인걸까요?
#include <iostream>
#include <cstdio>
#include <time.h>
#include <string.h>
using namespace std;
int main()
{
int start = clock();
const int max_num = 300000;
char* buff = new char[max_num * 7+1]; //7 = 6 digit(1~300000) + space(0x02), 1=null string
memset(buff, 0, sizeof(char)*max_num * 7+1);
for (int i = 0; i < max_num; i++)
{
sprintf(buff+7*i, "%06d ", i);
}
printf("%s\n", buff);
printf("Elapsed Time : %d ms\n", clock() - start);
return 0;
}
아래 코드처럼 sprintf()의 리턴값을 이용해서 조금더 최적화 했더니 30만개 출력시 1600ms 정도나오네요.
근데, 문제 1999번의 출력방법만 K개의 쿼리별로 각각printf()하는것과,
sprintf()로 K개의 결과값을 모두 버퍼에 모아서 한방에 출력하는 방법으로 테스트해봤는데
Judge 시스템에서 출력해주는 시간은 108ms으로 정확히 동일하네요.....
Judge에서의 printf() 처리가 점점더 궁금해집니다. printf()에 의한 딜레이를 감안해서 판정을 하는건지 아닌지.....
#include <iostream>
#include <cstdio>
#include <time.h>
#include <string.h>
using namespace std;
int main()
{
int start = clock();
const int max_num = 300000;
char* buff = new char[max_num * 7+1]; //7 = 6 digit(1~300000) + space(0x02), 1=null string
memset(buff, 0, sizeof(char)*max_num * 7+1);
int len = 0;
for (int i = 0; i < max_num; i++)
{
len += sprintf(buff+len, "%d ", i);
}
printf("%s\n", buff);
printf("Elapsed Time : %d ms\n", clock() - start);
return 0;
}
댓글을 작성하려면 로그인해야 합니다.
daniel00 6년 전
오늘 어떤 문제를 풀다가 갑자기 궁금한게 생겨서요.
쿼리를 30만개 하는문제가 있는데 , 각 쿼리마다 printf()로 답을 출력 하라고 하네요.
알고리즘을 차치하고라도 , 실제로 io에 접근하는 시간이 무척 큰데요
judge시스템에서는 실제로 프린트된 값을 어떻게 확인하는걸까요?
그리고 이런경우 어떻게하면 출력 시간을 단축할 수 있을까요?
여러분들의 의견을 듣고 싶습니다.
수고하세요.