https://www.acmicpc.net/problem/3273
3273번: 두 수의 합
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는
www.acmicpc.net
문제를 마주쳤을 때 사고의 흐름.
1. 수열을 정렬한다. sort() 써서.
2. binary search를 써서 해볼까? n(수열의 크기)범위를 보니 이중for문 쓰면 시간초과 나오겠다..
3. sort 한 후, 수열의 각 요소(a_i)를 차례대로 훑으면서 수열에서 X-a_i (=target) 에 해당하는 값이 있는지 찾아야 한다.
4. binary search를 돌리면서 mid가 x-a_i를 가리키는지 확인해보고, 없으면 -1, 있으면 result +=1.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
N = int(input())
arr = list(map(int, input().split()))
X = int(input())
arr.sort()
def binary_search(target, start, end):
if start>end:
return -1
mid = (start+end)//2
if arr[mid]<target:
return binary_search(target, mid+1, end)
elif arr[mid]==target:
return mid
else :
return binary_search(target, start, mid-1)
result = 0
for i in arr:
if binary_search(X-i, 0, len(arr)-1)>=0:
result+=1
print(result//2)
|
cs |
근데 이 문제는 이진탐색보다 훨씬 빠르게 풀 수 있다. for문 한번으로...^^;
1. 수열을 입력받고, set으로 저장한다. (튜플 형태다. if x in arr 하려고..)
2. 수열 한 번 훑으면서 X-i가 수열에 있으면, result+=1 한다.
코드
1
2
3
4
5
6
7
8
9
10
|
N = int(input())
arr = set(map(int, input().split()))
X = int(input())
result = 0
for i in arr:
if X-i in arr:
result+=1
print(result//2)
|
cs |
'python, pyTorch > 코딩테스트-파이썬' 카테고리의 다른 글
프로그래머스 Lv1. 다트게임 (0) | 2022.02.12 |
---|---|
프로그래머스 Lv2. 주차 요금 계산 (0) | 2022.02.04 |
BOJ 결혼식, 계단오르기 (0) | 2022.02.02 |
프로그래머스 Lv1. 신규아이디추천 (2) | 2022.01.19 |
DFS BFS 모음 (BOJ 1260, 11725, 2667) (0) | 2022.01.08 |