투 포인터 - (2)

DoHyunKim·2023년 7월 3일
0

Python With Algorithm

목록 보기
8/24

주몽의 명령

문제
주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.
갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 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개를 선택하기 때문이다.

profile
Do My Best!

0개의 댓글