https://www.acmicpc.net/problem/20444
20444번: 색종이와 가위
첫 줄에 정수 n, k가 주어진다. (1 ≤ n ≤ 231-1, 1 ≤ k ≤ 263-1)
www.acmicpc.net
문제
가위질을 N번하여 K개의 종이 조각으로 만들 수 있는지 확인하는 문제
문제를 풀기 위한 핵심적인 아이디어
1. 가위질을 가로로 하든 세로로 하든 순서는 상관없다. 각 방향으로 몇번을 하는지에
따라 최종적인 종이조각의 개수가 결정된다.
2. 가로 세로 가위질 횟수의 차이가 적을수록 종이조각이 많이 발생한다. ex 총 가위질횟수가 4인 경우 가로 세로 각각 2번씩 할 때 종이조각이 가장 많다 -> 이부분에서 이분탐색 아이디어가 적용된다.
3. 종이조각의 개수 = (가로 방향 가위질+1) * (세로 방향 가위질 +1)
코드
#include <iostream>
#include <vector>
#include <algorithm>
#define endl "\n"
using namespace std;
long long N, K, ans;
void Input() {
cin >> N>>K;
}
void Solve() {
long long l = 0, r = N, m, cnt;
while (l <= r) {
m = (l + r) / 2;
cnt = (m + 1) * (N - m + 1);
if (cnt == K) break;
else if (cnt < K) r = m-1;
else l = m + 1;
}
if (cnt == K) cout << "YES";
else cout << "NO";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "r", stdin);
Input();
Solve();
return 0;
}
'PS' 카테고리의 다른 글
[프로그래머스] 조이스틱 (C++) (1) | 2023.07.11 |
---|---|
[BAEKJOON] 1918 후위 표기식 (C++) (0) | 2023.07.10 |
[BAEKJOON] 2206 벽 부수고 이동하기 (C++) (0) | 2023.07.07 |
[BAEKJOON] 13164 행복 유치원 (C++) (0) | 2023.06.30 |
[BAEKJOON] 1092 배 (C++) (0) | 2023.06.29 |