300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 운영체제
- AI
- dp
- 그래프
- 리눅스
- nlp
- CSS
- 프로그래머스
- 알고리즘
- 프로그래밍
- 파이썬
- OS
- 동적 프로그래밍
- 코딩
- 동적프로그래밍
- google coding competition
- 코딩테스트
- 백준
- 딥러닝
- 코딩 테스트
- PYTHON
- 네트워크
- 킥스타트
- BFS
- 브루트포스
- DFS
- 순열
- kick start
- 구글 킥스타트
- linux
Archives
- Today
- Total
오뚝이개발자
[백준 2473] 세 용액 - 파이썬(Python) 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/2473
나의 풀이
그냥 n개의 원소 중 임의의 3개를 뽑아서 합을 구하는 방식으로 하게 되면 시간복잡도가 O(n^3)까지 올라가게 된다. 따라서 투 포인터를 사용해서 O(n^2)으로 풀어야 통과할 수 있다. i를 0~n-2까지 순회하면서 left와 right를 바꿔주어야 한다. 아래 코드는 python으로는 시간초과가 나왔고 pypy로 통과하였다. 서치를 해보니 대부분의 해답들이 pypy로 제출해 통과하였고, python으로 제출해 통과하려는 경우엔 iter를 사용해 좀 더 python스럽게 코드를 작성해야 한다.(하지만 이게 본 문제 알고리즘 풀이의 핵심이 아니므로 넘어가도록 한다.)
코드
# https://www.acmicpc.net/problem/2473
import sys
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().strip().split()))
arr.sort()
ans = [0, 0, 0]
res = float('inf')
for i in range(N-2):
l, r = i+1, N-1
while l < r:
curr = arr[i] + arr[l] + arr[r]
if abs(curr) < abs(res):
ans = [arr[i], arr[l], arr[r]]
res = curr
if curr > 0:
r -= 1
elif curr < 0:
l += 1
else: # curr == 0
print(arr[i], arr[l], arr[r])
sys.exit()
for num in ans:
print(num, end=' ')
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2143] 두 배열의 합 - 파이썬(Python) (0) | 2022.09.24 |
---|---|
[백준 2239] 스토쿠 - 파이썬(Python) (2) | 2022.09.24 |
[백준 20040] 사이클 게임 (0) | 2022.08.17 |
[백준 12851] 숨바꼭질 2 (0) | 2022.04.16 |
[백준 2638] 치즈 (0) | 2022.04.16 |
Comments