개발자/알고리즘

[백준] 3273 (feat. 집합 set)

june__kim 2022. 1. 15. 15:49

[백준] 3273 (feat. 집합 set)

 

 

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

 

num = int(input())
lst = list(map(int, input().split()))
sum = int(input())

count = 0
reside = []

for i in lst:
    reside.append(sum - i)

intersection = list(set(lst) & set(reside))

print(int(len(intersection)/2))

 

 

처음에는 그냥 2중 for문으로 돌려서 했는데 역시나 시간초과가 나왔다.

어떤 방법으로 할까 고민하다가 집합이 생각나서 집합으로 해결.

 

나의 경우는, 두 개의 집합을 만들어서 교집합하여 답을 구하는 방식으로 진행했다.

 

집합에도 참 많은 메소드들이 있는 것 같다.

필요할 때마다 좀 찾아보면서 메소드들을 익혀야 할 것 같다. (어차피 지금 다 정리해도 다 까먹음ㅋㅋ)

 

(집합 메소드:  https://wikidocs.net/16044)

 


집합에도 여러 방법이 있더라.

 

List
Set

 

List에서 if _ in array => 이거의 경우, 시간복잡도가 O(n)이지만

Set에서는 if _ in set => 이거의 경우, 시간복잡도가 O(1)이다.

 

이런 것을 보면, set을 통해서 확인하는 방법으로 시간복잡도 문제를 해결할 수 있을 듯 싶다.

 

진짜 깔끔하게 푸신 분

(https://www.acmicpc.net/source/18014614)

 


 

어떤 다른 분은, 이분탐색?을 사용하셨던데 이것도 좋은 방법인 것 같다.

 

일단 정렬을 하고 맨왼쪽과 오른쪽을 하나씩 줄여가면서 x에 부합하는 값을 찾아가는 법.

(https://yongku.tistory.com/entry/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%80-3273%EB%B2%88-%EB%91%90-%EC%88%98%EC%9D%98-%ED%95%A9-%ED%8C%8C%EC%9D%B4%EC%8D%ACPython)