전체 페이지뷰

2015년 1월 28일 수요일

C 공백 문자열 입력받기

http://blog.naver.com/daejoon3/120130791828

차후정리

[생각] 평면과 점

평면과 점


3차원 좌표상에 4개의 점이 있다. 이들 점이 한 평면상에 위치하는지 여부를 판단하는 프로그램을 작성한다.

입력
첫 줄에는 테스트 케이스의 수 T를 입력받는다. 다음 줄부터는 한줄씩 점의 좌표를 네번 입력받는다.
점의 좌표는 정수이며 x, y, z의 순서이다.
이를 테스트 케이스 T만큼 반복한다.

출력
각각의 테스트 케이스에 대해서 4점이 한평면에 위치하면 YES를 그렇지 않으면 NO를 출력한다.
한줄에 하나씩 출력

입력 제한
1 <= T <= 10^4
 -10^3 <= x, y, z <= 10^3

입력 예제 #1
1
1 2 0
2 3 0
4 0 0
0 0 0

출력 예제 #1
YES

예제 설명 #1
4개의 점 모두 z좌표값이 0이다. 따라서 같은 평면에 있고 출력값은 YES이다.

[생각] 더큰문자열 찾기

더 큰 문자열 찾기


알파벳 소문자로만 이루어진 문자열 w가 있다. w의 문자들을 재 조합해서 또다른 문자열 s를 만드는데 s는 w보다 그 크기가 크다.
(크기가 크다는 것은 사전 편찬 식으로 정렬했을 때 s가 w보다 뒤에 위치하게 된다는 의미이다.)

입력
첫출에 테스트할 횟수 t를 입력받는다.
그 다음 줄 부터 문자열 w를 입력받는다.

출력
각각의 테스트 케이스에 대해서 s를 출력한다. s가 여러개일 경우 그 중 가장 작은 것을 출력한다.
답이 존재하지 않으면 "no answer"를 출력한다.

제한
1 <= t <= 10^5
1 <= (w의 길이) <= 100
w는 알파벳 소문자로만 이루어져있으며, 길이가 100을 초과하지 않는다.

입력 예제 #1
3
ab
bb
hefg

출력 예제 #1
ba
no answer
hegf

입력 예제 #2
15
zedawdvyyfumwpupuinbdbfndyehircmylbaowuptgmw
zyyxwwtrrnmlggfeb
ocsmerkgidvddsazqxjbqlrrxcotrnfvtnlutlfcafdlwiismslaytqdbvlmcpapfbmzxmftrkkqvkpflxpezzapllerxyzlcf
biehzcmjckznhwrfgglverxsezxuqpj
rebjvsszebhehuojrkkhszxltyqfdvayusylgmgkdivzlpmmtvbsavxvydldmsym
unpzhmbgrrs
jprfovzkdlmdcesdcpdchcwoedjchcovklhrhlzfeeptoewcqpxg
ywsfmynmiylcjgrfrrmtyeeykffzkuphpajndwxjteyjba
dkuashjzsdq
gwakhcpkolybihkmxyecrdhsvycjrljajlmlqgpcnmvvkjlkvdowzdfikh
nebsajjbbuifimjpdcqfygeitief
qetpicxagjkydehfnvfxrtigljlheulcsfidjjozbsnomygqbcmpffwswptbgkzrbgqwnczrcfynjmhebfbgseuhckbt..

[생각] 주식투자

주식 투자


당신은 오늘 부터 N일(DAY) 동안의 삼성전자 주가를 예측할 수있는 알고리즘을 개발했다(와우~!!!).

다만 현재 예산으로는 N일 동안 각각의 날에 다음의 액션중 하나만을 취할 수 있다.

1) 어떤 날은 삼성전자 주식 1주를 살 수 있다.
2) 어떤 날은 가지고 있는 주식 중 일부 혹은 전부를 팔 수 있다
3) 어떤 날은 아무런 액션을 취하지 않을 수도 있다.

N일 뒤에 최고의 수익을 남기기 위해서는 어떠한 전략을 수행해야 하는가?

입력
첫 줄에는 테스트 케이스의 수 T를 입력받는다.
다음에는 숫자 N을 입력한다.
그 다음 줄에는 N일 동안 예측한 주식의 가격을 입력한다. (모두 정수, 스페이스로 구분)
이것을 T만큼 반복한다.

출력
각각의 테스트 케이스에 대해서 최고로 얻을 수 있는 수익을 출력한다.

제한
 1 <= T <= 10
1 <= N <= 50000

입력 예제 #1
3
3
5 3 2
3
1 2 100
4
1 3 1 2

출력 예제 #1
0
197
3

예제 설명 #1
첫번째 테스트 케이스
주가가 5 > 3 > 2로 떨어지기만 한다. 이래서는 수익을 낼수가 없다.
두번째 테스트 케이스
1일과 2일에는 1주씩 구매한다. 3일때 모든 주식을 판매한다.
세번째 테스트 케이스
1일째 1주를 구매하고 2일째 이 것을 판매한다. 3일째 다시 1주를 구매하고 4일째 판매한다.

[생각] 9와 0

9와 0


숫자 0과 9로만 이루어진 0 이상의 정수 X가 있다. (ex: 90, 9990, 9009009)
0이상의 정수 N이 주어졌을 때 X중 N의 배수이면서 가장 작은 수를 구하는 프로그램을 작성하시요.

입력
첫줄에 테스트 케이스 T를 입력 받는다. 다음 줄 부터 T줄만큼 N을 입력받는다.

출력
각각의 테스트 케이스에 대해서 조건 만족하는 수 X를 한줄에 하나씩 출력한다. 단 숫자 앞에 0이 와서는 안된다.
(ex: 00999 > 999로 출력할 것)

제한
1 <= T <= 104
1 <= N <= 500

입력 예제 #1
3
5
7
1

출력 예제 #1
90
9009
9

예제 설명 #1
첫번째 테스트 케이스 : 5의 배수이면서 9와 0으로만 이루어진 가장 작은 수는 90이다.

[생각] 정수트리플

정수 트리플 (Triples)


정수 배열 d가 있다.
다음을 만족하는 트리플의 수를 구하라
d[i] < d[j] < d[k], i < j < k

입력
첫째 줄에 배열의 크기 N을 입력바는다.
두번째 줄에는 N개의 정수를 입력받는다. (스페이스로 구분)

출력
문제의 조건을 만족하는 트리플의 수를 출력한다.

제한
N <= 10^5
배열에 속한 모든 정수값은 0보다 크고 2^16 - 1 보다 작다.

예제 입력 #1
6
1 1 2 2 3 4

예제 출력 #1
4

예제 설명 #1
조건을 만족하는 트리플은 다음과 갔다.
(1,2,3)
(1,2,4)
(1,3,4)
(2,3,4)

[생각] 배열의 무게 중심

배열의 무게 중심


[A1][A2]....[An]으로 이루어진 배열이 있다. 이 배열에서 다음의 조건을 만족하는 요소 Ai가 있는지 검사하는 프로그램을 작성하시오
1. Ai의 왼쪽에 있는 요소들의 합과 오른쪽에 있는 요소들의 합이 동일하다.
2. 왼쪽이나 오른쪽에 요소가 없다면 (A1이거나 An이라면) 합은 0으로 간주한다.

즉 [A1] + [A2].... [Ai-1] = [Ai+1] + [Ai+2] + [An]

입력
첫 번째 줄에 테스트 케이스의 수를 입력한다.
각 테스트 케이스에서 첫번째 줄은 배열의 크기 N을 그 다음 줄은 스페이스로 구분한 배열의 요소들을 입력받는다.

출력
각각의 테스트 케이스에 대해서 Ai가 존재하면 YES를 그렇지 않으면 No를 출력한다.

입력 예제 #1
2
3
1 2 3
4
1 2 3 3

출력 예제 #1
NO
YES

예제 설명 #1
첫번째 케이스에서는 만족하는 것을 찾을 수 없다.
두번째 케이스에서는 A[1] + A[2] = A[4]이다.

가산점
처리 속도를 향상시키면 가산점

[생각] 정수쌍

정수쌍(Pairs)


N개의 정수가 주어졌을 때 그 차가 K인 정수 쌍의 수를 구하시오

입력
첫째 줄에 N, K를 입력받는다. (스페이스로 구분)
두번째 줄부터 N개의 정수를 입력받는다. 단, 모든 정수는 그 값이 서로 달라야 한다. (스페이스로 구분)

출력
차가 K인 정수 쌍의 수를 출력한다.

제한
N <= 10^5
0 < K < 10^9
각 정수는 0보다 크고 2^31 - 1 보다 작다.

예제 입력 #1
5 2
1 5 3 4 2

예제 출력 #1
3

예제 입력 #2
10 1
363374326 364147530 61825163 1073065718 1281246024 1399469912 428047635 491595254 879792181 1069262793

예제 출력 #2
0

가산점

N개의 정수를 입력받았을 때 각각의 차가 K인것을 체크하려면 N^2의 비교가 필요하고 N이 커질수록 처리속도가 급격히 증가하게 된다.
이를 해결하기 위해 Time Complecity가 O(N log N)이거나 이보다 효율적으로 구현하도록 구현 하면 가산점 추가됨.

[생각] 막대자르기

막대기 자르기


각각 0이상의 정수를 길이로 하는 N개의 막대기가 있다. 이 막대기들 중 가장 짧은 막대기의 길이로 모든 막대기를 자르는 것을 [cut operation]이라고 하자.

예를 들어 6개의 막대기가 있고 그 길이가 다음과 같다면

5 4 4 2 2 8

이 경우 [Cut Operation]을 한번 수행하면 다음과 같다.

3 2 2 6

(가장 짧은 길이인 2로 6개의 막대기를 잘라내고 길이가 0이 되버린 2개의 막대기는 버려진다.)

N개의 막대기와 그 각각의 길이가 주어졌을 때 [Cut Operation]을 모든 막대기가 버려질 때(길이가 0이 될때)까지 반복하고  수행 시 마다 남은 막대기의 수를 출력하는 프로그램을 작성하라.

입력
첫줄에 막대기의 수 N을, 다음 줄에 각각의 막대기의 길이를 공백으로 구분해서 입력한다.

출력
매 줄마다 [Cut Operation]이 수행 되 때 마다 남은 막대기의 수를 출력

제한
1 <= N <= 1000
1 <= 막대기의 길이 <= 1000

입력 예제 #1
6
5 4 4 2 2 8

출력 예제 #1
6
4
2
1

입력 예제 #2
8
1 2 3 4 3 3 2 1

출력 예제 #2
8
6
4
1

2015년 1월 21일 수요일

fflush 함수의 올바른 사용방법

네트워크 프로그래밍에서 많이 다루게되는

문자열 처리에 도움이된다.

http://june0313.blog.me/50160420040

차후에 정리. 참고.

2015년 1월 7일 수요일

TCP/IP 패킷 송수신 처리에 대하여



<TCP/IP 패킷 송신처리>
① 어플리케이션의 처리(Application Layer)
    메일의 송신을 예로 들면, 메일 어플리케이션 프로그램을 작동시켜 '안녕하세요'라는
    텍스트를 입력한다. 그리고 메일송신 버튼을 누르면 Presentation Layer에서 부호화 처리를
    한다. 변환후메일을 송신하는데, 소프트웨어에 따라서 메일을 한꺼번에 송신할지를
    결정하는 기능이 있다. 이러한 통신의 커넥션을 언제 확립하여 언제 전송할지의 기능은
    Session Layer에서 관리한다.

② TCP 모듈의 처리(Transport Layer)
    TCP는 어플리케이션의 지시에 의해 접속의 확립, 데이터의 송신, 접속의 절단 등의
    기능을 하는데, 송신하는 데이터에 대한 신뢰성을 제공한다.
    TCP 기능을 실현하기 위해 TCP의 헤더를 붙여서 보낸다. 헤더에는 포트번호, 시퀸스번호,
    체크섬 등이 포함되어, 데이터와 함꼐 IP로 보내진다.
    - 포트번호 : 송신호스트와 수신호스트의 어플리케이션을 식별하기 위한 번호
    - 시퀸스번호 : 그 패킷의 데이터가 몇바이트째의 데이터인지를 나타내는 번호
    - 체크섬 : 데이터가 파괴되어 있지 않았다는 걸 증명하기 위한 정보

③ IP 모듈의 처리(Internet Layer)
    TCP에서 넘겨진 TCP헤더와 데이터를 하나의 데이터로 다루며, 데이터에 IP헤더가
    붙여진다. IP 헤더에는 수신처와 송신처의 논리적인 주소가 붙으며, 다음으로는 TCP인지
    UDP인지를 표시하는 정보가 포함된다. 패킷이 완성되면 라우팅 테이블을 참조하여
    다음으로 패킷을 넘길 라우터나 호스트를 결정한다. 그리고 목적지의 NIC에 패킷을 넘겨
    실제로 전송처리가 이루어진다.
    통신할 상대의 MAC Address를 모를 경우, ARP(Address Resolution Porotocol)를
    이용하여 목적지의 MAC Address를 구한 후 송신한다.  

④ 네트워크 인터페이스의 처리(Network Access Layer)
    IP 패킷을 단순한 데이터로 취급하여, 이 데이터에 이더넷 헤더를 부가한다.
    이더넷 헤더에는 송ㆍ수신지의 MAC Address, 이더넷헤더에 이어지는 데이터의
    프로토콜을 나타내는 이더넷 타입이 기록된다. 이상의 처리후 물리층을 통해 송신되는데,
    송신 처리중에 FCS(Frame Check Sequence)가 하드웨어적으로 계산되어 프레임 끝에
    붙게 되며, 이는 데이터가 파괴된 것을 검출하기 위한 것이다.

<TCP/IP 패킷 수신처리>
① 네트워크 인터페이스의 처리(Network Access Layer)
    데이터를 받은 호스트는 수신처 MAC Address가 자신과 일치하는 아닌지를 검사후,
    자신이 아니라면 프레임을 버린다. 다음으로 이더넷 타입 필드를 살펴서, 일치하는
    프로토콜을 처리하는 루틴에 데이터를 넘긴다. IP이면 IP를 처리하는 루틴으로 보내지고,
    ARP면 ARP를 처리하는 루틴으로 넘기게 된다. 만일 일치하는 프로토콜 처리 루틴이
    없다면 프레임을 버리게 된다.
② IP 모듈의 처리(Internet Layer)
    IP의 루틴에 데이터가 넘겨지면, 수신 IP 주소가 자기 호스트의 IP주소이면 수신하고,
    상위 프로토콜을 살펴 TCP이면 TCP 처리 루틴으로, UDP면 UDP 처리 루틴으로 보낸다.
    라우터의 경우 수신하는 패킷의 IP 주소가 거의 자기앞이 아니므로 라우팅 테이블과
    비교하여 다음에 보내게 되는 호스트나 라우터를 살펴 전송하게 된다.
③ TCP 모듈의 처리(Transport Layer)
    CheckSum을 살펴 데이터가 파괴되어 있지 않다는 것을 확인한 후, 데이터를 차례대로
    수신하고 있는지를 확인한다. 또 포트번호를 확인하여 통신을 하고 있는 어플리케이션을
    지정한다. 데이터가 제대로 도착한 경우 송신 호스트에 데이터가 도착했다는 '확인응답'을
    보내고, 송신 호스트에서 확인응답을 받지 못할 경우, 받을 수 있을때까지 계속 보내게
    된다. 데이터를 올바르게 수신한 경우 포트번호로 식별한 어플리케이션 프로그램에
    데이터가 그대로 넘겨진다.
④ 어플리케이션의 처리(Application Layer)
    송신측에서 보낸 데이터를 그대로 받게 된다. 데이터를 해석하여 모든 처리가 이상없이
    진행되었다면 어플리케이션에 정상종료 메세지를 보내고 이 과정을 거쳐 디스플레이 된다.