
package 이분탐색;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 색종이와가위 {
static int n;
static long k;
static String ans = "NO";
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
/**
* 백준 20444 색종이와 가위
* 접근법.
* 접근 색종이를 자를수 있는 방법은 가로,세로
* 가로 세로 자르는 방법을 정해진 가위질 만큼 모든 경우에수를 해본다 (시간초과를 생각못함)
*
* 2번째
* 최대로 많이 조각을 낼 수있는 경우는 가로n/2 세로n/2 번으로 자르는것
* 그래서 최대 경우의 수를 n/2+1번으로 지정하고 mid를 기준으로 가로 자르는 개수 세로 자르는 개수를 정한다.
* int col = mid+1;
* int row = n-mid+1;
*
* long pieces = col* row; -> 조각 개수
* 그리고 기준과 비교하면서 값을 도출
*/
n = Integer.parseInt(st.nextToken());
k = Long.parseLong(st.nextToken());
int left = 0 ;
int right = n/2+1; // 홀수일 경우는 +1 해줘야 하므로
while(left <= right){
int mid = (left + right)/2;
int col = mid+1;
int row = n-mid+1;
long pieces = col* row;
if(pieces < k){
left = mid+1;
}else if (pieces > k){
right = mid-1;
}else{
ans = "YES";
break;
}
}
System.out.println(ans);
}
}
풀이법
접근법 1
접근 색종이를 자를수 있는 방법은 가로,세로
가로 세로 자르는 방법을 정해진 가위질 만큼 모든 경우에수를 해본다 (시간초과를 생각못함)

범위를 간과했다
2번째 이분탐색으로 접근
최대로 많이 조각을 낼 수있는 경우는 가로n/2 세로n/2 번으로 자르는것
그래서 최대 경우의 수를 n/2+1번으로 지정하고 mid를 기준으로 가로 자르는 개수 세로 자르는 개수를 정한다.
int col = mid+1;
int row = n-mid+1;
long pieces = col* row; -> 조각 개수
그리고 기준과 비교하면서 값을 도출
'알고리즘 문제풀이' 카테고리의 다른 글
백준 5710 전기요금 (0) | 2021.07.18 |
---|---|
백준 20164 홀수홀릭호석 (0) | 2021.06.28 |
백준 10216 Count Circle Groups (0) | 2021.01.12 |
백준 17352 여러분의 다리가 되어 드리겠습니다! (0) | 2021.01.12 |
백준 16236 아기상어 (bfs,구현,시뮬) (0) | 2020.12.30 |
댓글