[BaekJoon] 백준 20444번 색종이와 가위
문제: https://www.acmicpc.net/problem/20444
내코드
처음으로 규칙을 찾아보았다. 6(n)번 가위질을 하는 것을 예시로 들었을 때 모든 경우의 수는 다음과 같다.
7(1X7, 가로0 세로6), 12(2X6, 가로1 세로5), 15(3X5, 가로2 세로4), 16(4X4, 가로3 세로 3)
즉, 가로로 자르는 횟수와 세로로 자르는 횟수에 의해 잘라진 색종이의 개수(k)가 정해진다.
여기서 색종이의 개수를 두 수의 곱으로 표현해 뒀는데 각각의 수를 a, b라고 하자.
이를 식으로 표현해보면
a + b = n + 2
a x b = k
이다.
문제에서 입력으로 n과 k는 주어지므로 위의 식을 만족하는 a와 b를 구하면 된다.
b = n + 2 - a 이므로
a x (n + 2 - a) = k 이고
a^2 - (n + 2)a + k = 0 이다.
a, b는 둘다 양수여야 하므로
근의 공식을 이용하면
((n + 2) +- 루트((n+2)^2 - 4k)) / 2가 자연수여야 YES가 된다.
# BaekJoon20444.py
n, k = map(int, input().split())
def solve():
global n, k
value = (n + 2) ** 2 - 4 * k
# 근이 무리수가 아니어야함
if value < 0:
print("NO")
return
# 근이 정수여야 함
if int(value ** 0.5) ** 2 != value:
print("NO")
return
first = ((n + 2) - value ** 0.5) / 2
second = ((n + 2) + value ** 0.5) / 2
# 2로 나눴을 때 정수여야 함
if int(first) != first or int(second) != second:
print("NO")
return
# 근이 자연수여야 함
if first > 0 and second > 0:
print("YES")
return
print("NO")
solve()
728x90
반응형
'CS > Algorithm 문제' 카테고리의 다른 글
[BaekJoon] 백준 1913번 달팽이 (0) | 2021.08.07 |
---|---|
[BaekJoon] 백준 1325 효율적인 해킹 (0) | 2021.08.07 |
[BaekJoon] 백준 1182번 부분수열의 합 (0) | 2021.08.06 |
[BaekJoon] 백준 18870번 좌표 압축 (0) | 2021.07.31 |
[BaekJoon] 백준 2630번 색종이 만들기 (0) | 2021.07.31 |