Koala - 18기/코딩테스트 심화 스터디

[백준 / Python] 7453 합이 0인 네 정수

beans3142 2025. 4. 6. 16:21

문제

https://www.acmicpc.net/problem/7453

알고리즘

투 포인터 or 해시 맵, 중간에서 만나기

풀이

a,b,c,d로 4중 for문을 돌리면 O(N^4)의 경우 시간초과로 터진다.

이걸 a,b와 c,d로 나눠서 각각 O(N^2)으로 해결하고, 분리된 ab와 cd를 해시맵 또는 투포인터로 연결시켜주면, O(N^2)으로 문제를 해결할 수 있다.

해시맵보다는 투포인터를 추천한다. 해시맵에 값이 너무 들어가는 경우 해시 충돌로 인해 속도가 오히려 느려진다.

코드

from sys import stdin
input = stdin.readline

n = int(input())
A, B, C, D = [], [], [], []

for _ in range(n):
    a, b, c, d = map(int, input().split())
    A.append(a)
    B.append(b)
    C.append(c)
    D.append(d)

AB = []
CD = []

for a in A:
    for b in B:
        AB.append(a + b)

for c in C:
    for d in D:
        CD.append(c + d)

AB.sort()
CD.sort(reverse=True)

i, j = 0, 0
cnt = 0
len_ab, len_cd = len(AB), len(CD)

while i < len_ab and j < len_cd:
    current_ab = AB[i]
    current_cd = CD[j]
    total = current_ab + current_cd

    if total == 0:
        ab_count = 0
        while i < len_ab and AB[i] == current_ab:
            ab_count += 1
            i += 1

        cd_count = 0
        while j < len_cd and CD[j] == current_cd:
            cd_count += 1
            j += 1

        cnt += ab_count * cd_count

    elif total < 0:
        i += 1
    else:
        j += 1

print(cnt)