728x90
반응형
https://www.acmicpc.net/problem/7453
7453번: 합이 0인 네 정수
첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 228이다.
www.acmicpc.net
문제 해결
- 먼저 n행이면 배열의 크기가 n이라는 것이고 열은 각각 A,B,C,D를 나타낸다는 것을 알아야한다.
- A,B,C,D를 각각 원소를 찾기에는 (O($n^{4}$))의 시간복잡도가 나오기 때문에 가급적 줄여야한다.
- 따라서 AB원소의 합을 ab에 CD원소의 합을 cd에 넣어서 줄일려고 하였다.(O($n^{2}$))
- 그리고 원소를 각각 오름차순으로 배열을 하고 ab는 인덱스0부터 cd는 인덱스 (len(cd)-1)부터 시작하여 합이 0이 되는 부분을 투포인터를 이용하여 푸는 것이다.
CODE
import sys
input = sys.stdin.readline
n = int(input())
graph = [list(map(int, input().split())) for _ in range(n)]
ab, cd = [], [] # A열과 B열의 원소의 합을 원소로 갖는 ab, C열과 D열의 원소의 합을 원소로 갖는 cd
for i in range(n):
for j in range(n):
ab.append(graph[i][0] + graph[j][1])
cd.append(graph[i][2] + graph[j][3])
ab.sort()
cd.sort()
i,j = 0, len(cd)-1
answer = 0
while i<len(ab) and j>=0:
if ab[i]+ cd[j] ==0:
nexti, nextj = i+1, j-1
while nexti < len(ab) and ab[i] == ab[nexti]:
nexti += 1
while nextj >= 0 and cd[j] == cd[nextj]:
nextj -= 1
answer += (nexti-i)*(j-nextj)
i, j = nexti, nextj
elif ab[i] + cd[j]>0:
j-= 1
else:
i += 1
print(answer)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 17471 게리맨더링 (0) | 2023.04.26 |
---|---|
[python] 백준 1477 휴게소 세우기 (0) | 2023.04.25 |
[python] 백준 2473 세 용액 (0) | 2023.04.24 |
[python] 백준 1727 커플 만들기 (0) | 2023.04.24 |
[python] 백준 3151 합이 0 (0) | 2023.04.24 |
댓글