0. 문제 링크
https://www.acmicpc.net/problem/20366
1. 풀이 방법
- 투 포인터로 풀었음 (투 포인터로 안 풀어도 됨)
- 이를 위하여 눈덩이를 크기 순서대로 정렬하였음
- 우선 엘사의 범위는 for문을 이용하여 구하였음
- 엘사의 눈사람의 길이가 정해지면, 투포인터를 이용하여 안나의 눈사람의 길이를 구함
- 만약 엘사 > 안나라면 안나의 눈사람이 커져야 하므로 left += 1 하였음
- 만약 엘사 < 안나라면 안나의 눈사람이 작아져야 하므로 right -= 1 하였음
- 만약 엘사 == 안나라면 차이가 0이 되므로, 0을 출력하고 프로그램을 종료하였음
- 그게 아니라면 엘사와 안나의 눈사람 차이의 최솟값을 구하여 반환하였음
- 반환받은 곳에서도 계속해서 최솟값을 구하였음
2. 코드
import sys
input = sys.stdin.readline
def logic(elsa, left, right):
# elsa의 범위 안에서 선택하여 최솟값을 반환함
val = sys.maxsize
while left < right:
anna = maps[left] + maps[right]
if elsa > anna: # 엘사가 더 크다면 안나를 키워야 함
left += 1
elif elsa < anna: # 그 반대로
right -= 1
else: # 만약 둘이 같다면 0이 되는 최솟값이 나오는 것이므로 끝냄
print(0)
exit(0)
val = min(val, abs(elsa - anna)) # 최솟값을 반환해야 함
return val
if __name__ == "__main__":
n = int(input())
maps = list(map(int, input().split()))
maps.sort()
ans = sys.maxsize
for i in range(n):
for j in range(n - 1, max(i + 2, 0), -1):
# elsa의 범위를 줄임. 이때 안에 최소 2개의 원소는 들어갈 수 있도록 만들어야 함
ans = min(ans, logic(maps[i] + maps[j], i + 1, j - 1))
print(ans)
3. 마무리
'Computer Science > 알고리즘' 카테고리의 다른 글
[백준 - Python] 18870 - 좌표 압축 (0) | 2023.05.11 |
---|---|
[백준 - Python] 2193 - 이친수 (1) | 2023.05.10 |
[백준 - Python] 7662 - 이중 우선순위 큐 (0) | 2023.05.09 |
[백준 - Python] 1045 - 도로 (0) | 2023.05.09 |
[백준 - Python] 20442 - ㅋㅋ루ㅋㅋ (1) | 2023.05.03 |