본문 바로가기

코딩테스트/Python

[Python] 백준 #3273 - 두 수의 합

문제


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

 

 

 

풀이


문제 푸는 방식은 같지만 다른사람 코드가 더 깔끔하여 가져왔다.

 

이 문제는 start와 end를 사용하는 투 포인터를 사용해야한다.

 

오름차순으로 정렬을 해주고 양 끝에서 합을 구해가면서 답을 찾는 방식이다.

 

start를 첫 인덱스, end를 마지막 인덱스로 지정하기위해 start = 0, end = n-1을 해준다.

 

start보다 end가 클 때 동안,

1. 만약 arr[start] + arr[end] ==x 면 답을 +1 해주고 start를 1을 더해준다.

2. 만약 arr[start] + arr[end] < x 면 더 큰 수를 더해야하기 때문에 start를 +1을 해준다.

3. 만약 arr[start] + arr[end] > x 면 더 작은 수를 더해야하기 때문에 end -1 을 해준다.

 

 

다른사람 코드 - 정돈된 코드

import sys

n = int(input())
numbers = sorted(list(map(int, sys.stdin.readline().split())))
x = int(input())

answer = 0
left, right = 0, n-1 # 왼쪽, 오른쪽
while left < right:
    temp = numbers[left] + numbers[right]
    if temp == x:
        answer += 1
        left += 1
    elif temp < x:
        left += 1
    else:
        right -= 1
print(answer)

 

 

 

내 코드

n = int(input())
arr = list(map(int,input().split()))
x = int(input())

start,end=0,n-1
cnt=0

arr.sort()
for i in range(n):
    while arr[start] + arr[end] < x and start<n-1:
        start+=1
    while arr[start] + arr[end] > x and end > 1:
        end-=1
    if start >= end:
        break
    if arr[start] + arr[end] == x:
        cnt+=1
        end-=1
        start+=1
print(cnt)

start와 end의 비교를 if문으로 넣었기때문에 코드의 길이가 더 길어졌다.

 

출처 - https://velog.io/@djagmlrhks3/Algorithm-BaekJoon-3273.-%EB%91%90-%EC%88%98%EC%9D%98-%ED%95%A9-by-Python