-
[ Python] BOJ 3273 : 두 수의 합코딩테스트/백준 2024. 10. 10. 08:13
https://www.acmicpc.net/problem/3273
요구사항
- 시간 제한 1초 지만 N<100,000 -> O(N**2) 는 힘들다.
- 메모리 제한 128M지만 100,000이라 리스트를 너무 남발하면 초과할 것.
설계 1
- combinations 모듈을 불러와서 2개의 조합을 구한다.
- 자연수 x와 조합의 합이 같은 지 비교하여 count 한다.
구현 1
import sys from itertools import combinations input = lambda: sys.stdin.readline().rstrip() N = int(input()) n_list = tuple(map(int, input().split())) compare_num = int(input()) count = 0 for combi in combinations(n_list, 2): if sum(combi) == compare_num: count += 1 print(count)
백준에서 실패 이유
- 다른 알고리즘 접근법이 생각이 안났다. (제한된 시간)
- 떠오른 건 2가지이다.
- 빠르게 입력 받기
- n_list을 초기화할 때 tuple 로 하기
- 그래도 안된다.
- 그 이유는 combinations(n_list, 2)는 N개의 요소로부터 2개를 선택하는 모든 조합을 구하기 때문에 N(N-1)/2 즉, O(N**2)이 되는 것이다.
- 따라서 다른 방법을 사용해야 한다.
설계 2
- 양 끝에서부터 비교해서 두수를 더하자
- 근데 위 설계가 되려면 정렬 되어야 한다는 조건이 있다.
- 내가 알기로 파이썬의 정렬은 Timsort 알고리즘을 사용하는 데 시간복잡도가 낮았던 거 같다.
- 만일 더한 두 수가 비교하려는 수보다 작으면 왼쪽 인덱스 + 1
- 크다면 오른쪽 인덱스 - 1
- 만약 그래도 없다면?
- 예외처리
구현 2
import sys input = lambda: sys.stdin.readline().rstrip() N = int(input()) n_list = sorted(map(int, input().split())) compare_num = int(input()) count = 0 left, right = 0, N-1 while left < right: combi_sum = n_list[left] + n_list[right] if combi_sum == compare_num: count += 1 left += 1 right -= 1 elif combi_sum < compare_num: left += 1 elif combi_sum > compare_num: right -= 1 else: print("그런 조합 없다~") print(count)
'코딩테스트 > 백준' 카테고리의 다른 글
[Python] BOJ 11328 : Strfry (0) 2024.10.11 [Python] BOJ 13300 : 방배정 (0) 2024.10.11 [Python] BOJ 10808 : 알파벳 개수 (4) 2024.10.09 [Python] BOJ 14888 : 연산자 끼워넣기 (1) 2024.10.07 [Python] BOJ 15486 : 퇴사2 (1) 2024.10.05