using namespace std;
typedef vector<int> vi;
bool dp[2000][2000];
void B10942::Solution()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n;
vi nums = vi(n);
for (int i = 0; i < n; i++) cin >> nums[i];
for (int i = 0; i < n; i++)
{
int range = 0;
while (0 <= i - range && i + range < n)
{
if (nums[i - range] == nums[i + range])
dp[i - range][i + range] = true;
else break;
range++;
}
int offset = 1;
while (0 <= i - offset + 1 && i + offset < n)
{
if (nums[i - offset + 1] == nums[i + offset])
dp[i - offset + 1][i + offset] = true;
else break;
offset++;
}
}
cin >> m;
while (m--)
{
int s, e;
cin >> s >> e; // -1 한게 인덱스임
if (dp[s-1][e-1]) cout << 1 << '\n';
else cout << 0 << '\n';
}
}
ios::sync_with_stdio(false);랑 cin.tie(nullptr); 이거 안 붙였다고 계속 틀렸었다. 시간 복잡도 잘 계산해놨다면, 그 근거를 의심하지 말고 다른 이유를 찾아라.
표준 입출력 함수 장점
표준 입출력 함수 단점
int main(void)
{
FILE *fp;
int fd=open("data.dat", O_WRONLY|O_CREAT|O_TRUNC);
if(fd==-1)
{
fputs("file open error", stdout);
return -1;
}
fp = fdopen(fd, "w");
fputs("Network C programming \n", fp);
fclose(fp);
return 0;
}
fdopen()을 이용하여 FILE 구조체 포인터로 변환할 수 있다
예제는 open()으로 파일을 생성한 뒤, fdopen()으로 FILE 포인터를 가져온다.
fileno()는 반대다. FILE 포인터를 파일 디스크립터로 바꿔준다.
readfp=fdopen(clnt_sock, "r");
writefp=fdopen(clnt_sock, "w");
while(!feof(readfp))
{
fgets(message, BUF_SIZE, readfp);
fputs(message, writefp);
fflush(writefp);
}
fclose(readfp);
fclose(writefp);
echo_server.c에서 write()를 사용하던 부분을
문자열 기반의 fgets, fputs로 변경
readfp=fdopen(sock, "r");
writefp=fdopen(sock, "w");
while(1)
{
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
if(!strcmp(message, "q\n") || !strcmp(message,"Q\n"))
break;
fputs(message,writefp);
fflush(writefp);
fgets(message, BUF_SIZE, readfp);
printf("Message from server : %s", message);
}
echo_client.c를 문자열 기반 fgets, fputs로 변경
원래는 데이터 마지막에 0 삽입해서 수신 데이터를 문자열로 구성해야 했지만,
위에선 표준 입출력 함수를 사용하기 때문에 생략됐다.
보다시피 적용에 따른 부가적인 코드 발생 때문에 생각만큼 즐겨쓰진 않는다.
half close : 연결 종료해도 받을 데이터 있을 수 있으니 일부만 닫는거
Chapter 10에선 shutdown()으로 half close 구현했다.
출력모드 FILE 포인터로 fclose() 호출하면? half close가 아니라 입출력 다 닫혀버린다.
FILE 포인터
dup() : 파일 디스크립터 복사. 새 정수값 할당됨.
dup2() : 복사될 정수 값도 지정
writefp 만들 때 클라 소켓의 dup()을 인자로 주고,
shutdown(fileno(writefp), SHUT_WR) 호출하면 Half-close 진행됨.