Home > Baekjoon > 두 수의 합

두 수의 합
1 초 128 MB 34.798%

출처 : 두 수의 합

Solution
Python

import sys
input = sys.stdin.readline

if __name__ == '__main__':
    n = int(input())
    a = list(map(int, input().split()))
    x = int(input())
    
    a.sort() # 일단 정렬
    # a의 인덱스 값(i<j), 양끝에서 조사한다!
    i, j = 0, n-1
    # 숫자쌍의 갯수
    answer = 0
    # i가 j보다 작을 때 작동하도록 함, 즉 두 인덱스값이 만나면 종료
    while i<j:
        # 두 숫자합이 x와 같다면,
        if a[i]+a[j] == x:
            answer += 1 # 더해주고
            j -= 1 # j를 1 빼주거나, i를 1 더해주거나
        # 두 숫자합이 x보다 작다면
        elif a[i]+a[j] < x:
            i += 1 # 합이 커져야하니 i+1
        # 두 숫자합이 x보다 크다면
        elif a[i]+a[j] > x:
            j -= 1 # 합이 작아져야하니 j-1
    print(answer)

문제

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)

출력

문제의 조건을 만족하는 쌍의 개수를 출력한다.

예제 입력 1

9

5 12 7 10 9 1 2 3 11

13

예제 출력 1

3

W3sicHJvYmxlbV9pZCI6IjMyNzMiLCJwcm9ibGVtX2xhbmciOiIwIiwidGl0bGUiOiJcdWI0NTAgXHVjMjE4XHVjNzU4IFx1ZDU2OSIsImRlc2NyaXB0aW9uIjoiPHA+blx1YWMxY1x1Yzc1OCBcdWMxMWNcdWI4NWMgXHViMmU0XHViOTc4IFx1YzU5MVx1Yzc1OCBcdWM4MTVcdWMyMTggYTxzdWI+MTxcL3N1Yj4sIGE8c3ViPjI8XC9zdWI+LCAuLi4sIGE8c3ViPm48XC9zdWI+XHVjNzNjXHViODVjIFx1Yzc3NFx1YjhlOFx1YzViNFx1YzljNCBcdWMyMThcdWM1ZjRcdWM3NzQgXHVjNzg4XHViMmU0LiBhPHN1Yj5pPFwvc3ViPlx1Yzc1OCBcdWFjMTJcdWM3NDAgMVx1YmNmNFx1YjJlNCBcdWQwNmNcdWFjNzBcdWIwOTggXHVhYzE5XHVhY2UwLCAxMDAwMDAwXHViY2Y0XHViMmU0IFx1Yzc5MVx1YWM3MFx1YjA5OCBcdWFjMTlcdWM3NDAgXHVjNzkwXHVjNWYwXHVjMjE4XHVjNzc0XHViMmU0LiBcdWM3OTBcdWM1ZjBcdWMyMTggeFx1YWMwMCBcdWM4ZmNcdWM1YjRcdWM4NGNcdWM3NDQgXHViNTRjLCBhPHN1Yj5pPFwvc3ViPiArIGE8c3ViPmo8XC9zdWI+ID0geCAoMSAmbGU7IGkgJmx0OyBqICZsZTsgbilcdWM3NDQgXHViOWNjXHVjODcxXHVkNTU4XHViMjk0IChhPHN1Yj5pPFwvc3ViPiwgYTxzdWI+ajxcL3N1Yj4pXHVjMzBkXHVjNzU4IFx1YzIxOFx1Yjk3YyBcdWFkNmNcdWQ1NThcdWIyOTQgXHVkNTA0XHViODVjXHVhZGY4XHViN2E4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YzJkY1x1YzYyNC48XC9wPlxyXG4iLCJpbnB1dCI6IjxwPlx1Y2NhYlx1YzlmOCBcdWM5MDRcdWM1ZDAgXHVjMjE4XHVjNWY0XHVjNzU4IFx1ZDA2Y1x1YWUzMCBuXHVjNzc0IFx1YzhmY1x1YzViNFx1YzljNFx1YjJlNC4gXHViMmU0XHVjNzRjIFx1YzkwNFx1YzVkMFx1YjI5NCBcdWMyMThcdWM1ZjRcdWM1ZDAgXHVkM2VjXHVkNTY4XHViNDE4XHViMjk0IFx1YzIxOFx1YWMwMCBcdWM4ZmNcdWM1YjRcdWM5YzRcdWIyZTQuIFx1YzE0Ylx1YzlmOCBcdWM5MDRcdWM1ZDBcdWIyOTQgeFx1YWMwMCBcdWM4ZmNcdWM1YjRcdWM5YzRcdWIyZTQuICgxICZsZTsgbiAmbGU7IDEwMDAwMCwgMSAmbGU7IHggJmxlOyAyMDAwMDAwKTxcL3A+XHJcbiIsIm91dHB1dCI6IjxwPlx1YmIzOFx1YzgxY1x1Yzc1OCBcdWM4NzBcdWFjNzRcdWM3NDQgXHViOWNjXHVjODcxXHVkNTU4XHViMjk0IFx1YzMwZFx1Yzc1OCBcdWFjMWNcdWMyMThcdWI5N2MgXHVjZDljXHViODI1XHVkNTVjXHViMmU0LjxcL3A+XHJcbiIsImhpbnQiOiIiLCJvcmlnaW5hbCI6IjAiLCJodG1sX3RpdGxlIjoiMCIsInByb2JsZW1fbGFuZ190Y29kZSI6IktvcmVhbiJ9LHsicHJvYmxlbV9pZCI6IjMyNzMiLCJwcm9ibGVtX2xhbmciOiIxIiwidGl0bGUiOiJTdW1YIiwiZGVzY3JpcHRpb24iOiI8cD5Db25zaWRlciBhIHNldCBvZiBuIGRpc3RpbmN0IHBvc2l0aXZlIGludGVnZXJzIGE8c3ViPjE8XC9zdWI+LCBhPHN1Yj4yPFwvc3ViPiwgJmhlbGxpcDssIGE8c3ViPm48XC9zdWI+LCBoYXZpbmcgdmFsdWVzIGJldHdlZW4gMSBhbmQgMTAwMDAwMCBhbmQgYW4gaW50ZWdlciB4LiBXcml0ZSBhIHByb2dyYW0mbmJzcDt0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwYWlycyAoYTxzdWI+aTxcL3N1Yj4sIGE8c3ViPmo8XC9zdWI+KSwgd2hlcmUgMSAmbGU7IGkgJmx0OyBqICZsZTsgbiBhbmQgYTxzdWI+aTxcL3N1Yj4gKyBhPHN1Yj5qPFwvc3ViPiA9IHguJm5ic3A7PFwvcD5cclxuIiwiaW5wdXQiOiI8cD5UaGUgZmlyc3QgbGluZSBvZiB0aGUgc3RhbmRhcmQgaW5wdXQgY29udGFpbnMgdGhlIGludGVnZXIgbiAoMSAmbGU7IG4gJmxlOyAxMDAwMDApLiBUaGUgc2Vjb25kIGxpbmUgY29udGFpbnMgbiBpbnRlZ2VycyAmbmRhc2g7IHRoZSBlbGVtZW50cyBvZiB0aGUgc2V0LiBPbiB0aGUgdGhpcmQgbGluZSB0aGUgaW50ZWdlciB4IGlzIGdpdmVuICgxICZsZTsgeCAmbGU7IDIwMDAwMDApIC4mbmJzcDs8XC9wPlxyXG4iLCJvdXRwdXQiOiI8cD5UaGUgcHJvZ3JhbSBzaG91bGQgb3V0cHV0IG9uIGEgc2luZ2xlIGxpbmUgb2YgdGhlIHN0YW5kYXJkIG91dHB1dCBhbiBpbnRlZ2VyICZuZGFzaDsgdGhlIGNhbGN1bGF0ZWQgbnVtYmVyIG9mIHBhaXJzLiZuYnNwOzxcL3A+XHJcbiIsImhpbnQiOiIiLCJvcmlnaW5hbCI6IjEiLCJodG1sX3RpdGxlIjoiMCIsInByb2JsZW1fbGFuZ190Y29kZSI6IkVuZ2xpc2gifV0=