백준 1940

justhaza.log·2024년 2월 28일

알고리즘: BOJ

목록 보기
36/125

중복 없는 n개의 재료 번호가 주어질 때,
두 재료의 합이 m이 되는 경우의 개수를 구하는 문제이다.


리스트의 두 원소의 합을 고려하는 문제라..
투 포인터 알고리즘을 사용했다.


입력 받은 재료 번호를 크기 순서대로 정렬한 뒤,
left, right라는 포인터를 통해,
두 재료 번호의 합과 m 값을 비교하는 과정을 반복 수행했다.


코드(정답)는 다음과 같다.

# 1940

import sys

n = int(sys.stdin.readline())
m = int(sys.stdin.readline())

identifiers = list(map(int, sys.stdin.readline().rstrip().split()))
identifiers.sort()

left = 0
right = len(identifiers) - 1
count = 0

while left < right:
    sum_identifiers = identifiers[left] + identifiers[right]

    if sum_identifiers < m:
        left += 1
    elif sum_identifiers > m:
        right -= 1
    else:
        count += 1
        left += 1
        right -= 1

print(count)

추가적으로 비슷한 논리로써 2중 for문을 생각할 수 있는데..
identifiers의 개수가 커지면 시간 복잡도가 커지는 문제가 있다.

그래서 투 포인터 알고리즘을 통한 선형적 접근이 더 적절해 보인다.

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글