문제
주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.
갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 M(1 ≤ M ≤ 10,000,000)이 되면 갑옷이 만들어 지게 된다. 야철대장은 자신이 만들고 있는 재료를 가지고 갑옷을 몇 개나 만들 수 있는지 궁금해졌다. 이러한 궁금증을 풀어 주기 위하여 N(1 ≤ N ≤ 15,000) 개의 재료와 M이 주어졌을 때 몇 개의 갑옷을 만들 수 있는지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고유한 번호들이 공백을 사이에 두고 주어진다. 고유한 번호는 100,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 갑옷을 만들 수 있는 개수를 출력한다.
입력 예시
6
9
2 7 4 1 5 3
출력 예시
2
코드 예시
import sys input=sys.stdin.readline n=int(input()) m=int(input()) arr=list(map(int,input().split())) i=0 j=n-1 count=0 arr.sort() while i<j: sum=arr[i]+arr[j] if sum==m: count+=1 i+=1 j-=1 elif sum>m: j-=1 else : i+=1 print(count)
해당 문제는 n=15000 이니 시간 복잡도 O(nlogn) 까지 허용한다. 그래서 sorting을 사용해도 된다.
2 7 4 1 5 3
이렇게 input을 1 2 3 4 5 7 로 sorting 한다.
이후 투 포인터인 start, end를 양 끝으로 잡는다.
A[start]+A[end]==m 이면
count++, 후에 start 와 end 둘 다 칸을 이동시킨다.
A[start]+A[end]>m 이면
더한 값이 더 크다는 의미이므로 end-- 를 해서 더한 값을 줄여준다.
A[start]+A[end]<m 이면
더한 값이 더 작다는 의미이므로 start++ 해서 더한 값을 키운다.
이러한 행동을 start==end 까지 반복하면 된다.
이렇게 문제를 풀 수 있었던 이유는 배열 원소 중 2개를 선택하기 때문이다.