링크 : https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
- 문제
- 소요시간: 34분 47초
- 설계하기(접근방법)
1. 입력받기
배열을 입력받는다
2. 구현하기
먼저 배열을 정렬해준다
그래야 가장 큰값과
가장 작은 값을 더하면서 비교할 수 있다
최소값은 sys.maxsize로 선언해준다
그 후 양 끝을
p1 = 시작점 index = 0
p2 = 끝점 index = n - 1
로 잡는다
그 둘을 더해본다
그것의 절대값과
최소값을 비교를하여
더 작다면 갱신해준다
그 후 만약
num_list[p2] - num_list[p1] 가 양의 값이라면
p2의 크기가 컸던 것이니
p2 를 1 줄여준다
반대로 음의 값이라면
p1의 크기가 작았던 것이니
p1를 +1 옮겨준다
둘의 합이 0이라면 그 자체가 최소값이니 break를 해준다
이 방식으로 p1 = p2일 때까지 진행해준다
3. 출력하기
더해서 최소값인 두 수를 출력한다
- 코드(출력)
import sys
n = int(input())
n_list = list(map(int, input().split()))
n_list.sort()
small = [sys.maxsize, 0, 0]
p1 = 0
p2 = n -1
# 이게 양수면 양수쪽 -1
p2 - p1
# 이게 음수면 음수쪽 + 1
while True:
if p1 == p2:
break
diff = n_list[p2] + n_list[p1]
if abs(diff) < small[0]:
small = [abs(diff), n_list[p1], n_list[p2]]
# 양수 쪽이 크다면
if diff > 0:
p2 -= 1
# 음수 쪽이 크다면
elif diff < 0:
p1 += 1
# 차이가 0이라면
else:
small = [0, n_list[p1], n_list[p2]]
break
print(small[1], small[2])
- 얻어갈 부분
1. while문을 True로 선언하고 안에 이중 while문을 넣지 않아 깔끔하게 풀 수 있었다
'알고리즘(백준) > 투포인터' 카테고리의 다른 글
[알고리즘/투 포인터] 2467번 : 용액 - python (0) | 2024.10.11 |
---|---|
[알고리즘/투 포인터] 1806번 : 부분 합 - python (0) | 2024.02.28 |
[알고리즘/투 포인터] 2230번 : 수 고르기 - python (1) | 2024.02.28 |
[알고리즘/투 포인터] 1940번 : 주몽 - python (0) | 2024.02.13 |