Computer Science/알고리즘

[백준 - Python] 20366 - 같이 눈사람 만들래?

바보1 2023. 5. 9. 23:40

0.  문제 링크

 

 

https://www.acmicpc.net/problem/20366

 

20366번: 같이 눈사람 만들래?

높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1

www.acmicpc.net


1.  풀이 방법

 

 

  1. 투 포인터로 풀었음 (투 포인터로 안 풀어도 됨)
    1. 이를 위하여 눈덩이를 크기 순서대로 정렬하였음
  2. 우선 엘사의 범위는 for문을 이용하여 구하였음
  3. 엘사의 눈사람의 길이가 정해지면, 투포인터를 이용하여 안나의 눈사람의 길이를 구함
    1. 만약 엘사 > 안나라면 안나의 눈사람이 커져야 하므로 left += 1 하였음
    2. 만약 엘사 < 안나라면 안나의 눈사람이 작아져야 하므로 right -= 1 하였음
    3. 만약 엘사 == 안나라면 차이가 0이 되므로, 0을 출력하고 프로그램을 종료하였음
  4. 그게 아니라면 엘사와 안나의 눈사람 차이의 최솟값을 구하여 반환하였음
  5. 반환받은 곳에서도 계속해서 최솟값을 구하였음

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.  마무리