Algorithm Study/Python

[백준 파이썬] # 3273 두 수의 합

728x90
반응형

Silver III

# 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

 

풀이

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

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

while start < end:
    summary = arr[start] + arr[end]
    if summary == x:
        cnt += 1
        start += 1
    elif summary > x:
        end -= 1
    elif summary < x:  # else로 처리 가능
        start += 1

print(cnt)

 

후기

  • 갓동빈님의 영상을 참고해서 투 포인터 사용법을 익히려고 시도했으나, 와닿지 않아서 여러번 실패를 거듭했다. 결국엔 다른 분의 풀이를 보고 나서 약간의 감을 잡을 수 있었다.

  • 이진 탐색을 응용(?) 하는 방식으로 투 포인터를 이해할 수 있었다. start, end라는 두 개의 좌표를 가지고 원하는 값을 발견했을 때 cnt += 1 & start += 1, 원하는 값이 나오지 않았을 때 start or end를 이동시켜 while문이 계속 진행될 수 있도록 설계한다.

  • 고집인지, 의지인지.. 힘들게 한 고비 넘어가는 것 같다.