메모/알고리즘

[백준] Python - 색종이와 가위

Floodnut 2021. 11. 2. 22:37
 

20444번: 색종이와 가위

첫 줄에 정수 n, k가 주어진다. (1 ≤ n ≤ 231-1, 1 ≤ k ≤ 263-1)

www.acmicpc.net

 

색종이와 가위 문제다.

이진탐색 문제라고는 하지만 이진탐색을 쓸 필요는 없다.

색종이를 잘랐을때 입력한 값 만큼의 사각형이 나오는지 판단하는 문제이다.

 

여기서 규칙이 하나 생기는데 

x를 가로로 자르는 횟수, y를 세로로 자르는 횟수, n을 총 자르는 횟수, k를 잘랐을 때 나오는 사각형의 총 개수라고 하면

1) x + y = n

2) (x+1)(y+1) = k가 성립한다.

 

여기서 1)에서 x = n - y를 2)에 대입하면 x에 대한 2차 방정식이 나온다.

사각형의 개수는 무조건 자연수일 수 밖에 없으니 이 2차 방정식을 근의 공식을 통해 해가 자연수로 나오는지 확인하면 된다.

 

더보기
import sys
import math as m

def quadratic_formula(cut, rect):
    poly = cut ** 2 + 4*cut - 4*rect + 4
    #cut == n
    #rect == k

    if poly < 0 :
        print("NO")
        return
    #1.1   1 != 1.1
    if int(poly) != poly:
        print("NO")
        return

    if int((poly**(1/2))) ** 2 != poly:
        print("NO")
        return

    result1 = (cut+2 + (poly**(1/2))) / 2
    result2 = (cut+2  - (poly**(1/2))) / 2

    if int(result1) != result1 or int(result2) != result2:
        print("NO")
        return

    if (result1 > 0) and (result2 > 0):
        print("YES")
        return
    else:
        print("NO")
        return

n, k = map(int, sys.stdin.readline().split())
quadratic_formula(n, k)