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
n = int(input())
a = list(map(int, input().split()))
x = int(input())
result = 0
a.sort()
left = 0
right = n-1
while left < right:
sum_value = a[left] + a[right]
if sum_value == x:
result += 1
left+=1
elif sum_value < x:
left+=1
else:
right -=1
print(result)
먼저 주어진 수열 a를 오름차순으로 정렬합니다.
그리고 수열 a의 인덱스를 나타내는 두 변수 left, right를 각각 0과 n-1로 초기화 했습니다.
- left, right는 수열의 처음과 끝을 나타냅니다.
while문으로 반복문을 수행하며 left가 right를 넘어가면 반복문을 종료합니다.
예를 들어 주어진 a가 [5, 12, 7, 10, 9, 1, 2, 3, 11, 13], x : 13 이라면 먼저 sort로 인하여 정렬을 합니다.
a : [1, 2, 3, 5, 7, 9, 10, 11, 12, 13]
left는 분홍색, right는 주황색으로 표현하겠습니다. 초기에는 다음과 같습니다.
[1, 2, 3, 5, 7, 9, 10, 11, 12, 13], sum_value : 14
이때 sum_value가 14라면 13(x) 보다 크기 때문에 right -=1이 한칸 왼쪽으로 움직여 아래처럼 위치합니다.
[1, 2, 3, 5, 7, 9, 10, 11, 12, 13]
sum_value가 13으로 x와 동일하기 때문에 result에 +1을 하고 left를 한칸 오른쪽으로 움직입니다.
[1, 2, 3, 5, 7, 9, 10, 11, 12, 13]
이렇게 x값과 비교하며 반복문을 수행합니다.
만약 sum_value가 x보다 작다면 left를 오른쪽으로 한칸 움직이게 됩니다.
sum_value가 x보다 크다면 오름차순 정렬로 인하여 더 큰값을 가진 right를 줄여 최대한 x와 가깝게 만들고,
sum_value가 x와 동일하거나 작다면 더 작은값인 left를 증가시켜 최대한 x와 동일하게 만드는 것입니다.
모든 반복문 종료되면 result를 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 연속된 부분 수열의 합 파이썬(Python) (0) | 2023.04.11 |
---|---|
[코딩테스트] 백준 숨바꼭질(1697) 파이썬(Python) (0) | 2023.04.11 |
[코딩테스트] 프로그래머스 추억 점수 파이썬(Python) (0) | 2023.04.07 |
[코딩테스트] 백준 수열(2559) 파이썬(Python) (0) | 2023.04.07 |
[코딩테스트] 백준 전화번호 목록 파이썬(Python) (0) | 2023.03.26 |