https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
두 문제는 완전히 같다. 경험치 두 배 이벤트는 항상 설레는 일이다.
접근
1. 투포인터로 접근할 수 있겠다.
2. 산성과 알칼리성 용액을 굳이 따로 구분해야 할까?
2-1. 어차피 합이 0보다 크다면 값을 줄여야하고, 0보다 작다면 값을 키워야한다.
2-2. 굳이 구분하지 않아도 될 것 같다.
풀이
1. 투 포인터를 각각 정해줍니다. n개의 용액에서 시작은 0이고, 끝은 n-1 입니다.
2. 용액을 모두 한 List(arr)에 저장합니다.
3. 출력할 조합을 담는 List(cmb)를 만들어 줍니다.
4. 이제 포인터에 해당하는 값을 더해보면서 기존의 조합(cmb)의 합보다 0에 가까운지 확인합니다.
더 가깝다면 조합(cmb)을 업데이트 해줍니다.
4-1. 업데이트 여부와 관계없이, 포인터에 해당하는 값을 더한 숫자가 0보다 작다면 stt에 1을 더합니다.
0에 더 가까워지기 위해서는 값이 커져야 가능성이 있기 때문입니다.
반대로 업데이트 여부와 관계없이, 포인터에 해당하는 값을 더한 숫자가 0보다 크다면 end에서 1을 빼줍니다.
0에 더 가까워지기 위해서는 값이 작아져야 가능성이 있기 때문입니다.
stt = 0
end = int(input())-1
# 투 포인터의 시작과 끝입니다.
#-------------------------#
arr = sorted(list(map(int,input().split())))
tgt = 0
# 입력과 동시에 정렬해줍니다.
# tgt(target)은 찾는 값입니다.
#-------------------------#
cmb = [arr[0], arr[-1]]
# cmb(combination)은 출력할 답을 담은 리스트입니다.
#-------------------------#
while stt < end:
if abs(arr[end] + arr[stt]) < abs(cmb[0] + cmb[1]):
cmb[0] = arr[stt]
cmb[1] = arr[end]
if arr[end] + arr[stt] < 0:
stt += 1
else:
end -= 1
# stt보다 end값이 더 크다면 계속 반복합니다.
# end는 stt보다 반드시 크거나 같습니다.
# end 번째의 값과 stt 번째의 값의 절댓값이, 기존 cmb의 절댓값보다 작다면 업데이트 해줍니다.
# 그리고, 그 연산 결과가 0보다 작다면 stt에 1을 더합니다, 값이 커져야만이 더 0에 가까워질 수 있기 때문입니다.
# 반대로, 그 연산 결과가 0보다 크다면 end에서 1을 빼줍니다. 값이 작아져야만이 더 0에 가까워질 수 있기 때문입니다.
#-------------------------#
print(cmb[0], cmb[1])
'ALGORITHM' 카테고리의 다른 글
[Python][BOJ] 백준 3190번 : 뱀 (0) | 2023.02.02 |
---|---|
[Python][Programmers] 프로그래머스 2022 KAKAO BLIND RECRUITMENT 주차요금계산 (0) | 2023.01.24 |
[Python][BOJ] 백준 9465번 : 스티커 (0) | 2023.01.10 |
[Python][BOJ] 백준 9205번 : 맥주 마시면서 걸어가기 (0) | 2023.01.06 |
[Python][BOJ] 백준 2468번 : 안전영역 (0) | 2023.01.04 |