상근이는 3003번에서 동혁이가 발견한 체스판을 톱으로 자르려고 한다.
상근이는 체스판을 최대 N번 자를 수 있으며, 변에 평행하게만 자를 수 있다. 또, 자를 때는 체스판의 그 변의 한쪽 끝에서 다른쪽 끝까지 잘라야 한다. 자른 후에는 조각을 이동할 수 없다.
이때, 최대 몇 조각을 낼 수 있는지 구하는 프로그램을 작성하시오.
다른 방법도 많겠지만 이 문제를 보고 바로 떠오른 방법으로 풀이해보았다. 내 풀이는 자르는 횟수를 홀수의 경우와 짝수의 경우로 나누어 풀이 하는 것이다.
자르는 횟수가 일 때, 최대 조각은 이다.
이 짝 수라면
, , ,
와 같은 패턴을 보입니다.
패턴을 좀더 편하게 보기 위해 을 2로 나누면
아래와 같은 식을 보입니다.
, , ,
즉, 짝 수의 경우 일때 최대 조각을 구하는 식은
이 성립됩니다.
이 경우는 가로, 세로 선의 개수에서 행, 열 칸의 개수 구하는 식으로 풀었습니다.
왜? 그냥 떠오른 식이라서
자르는 횟수가 일 때, 최대 조각은 이다.
행, 열 칸의 개수를 구하기 전에 가로, 세로 선의 개수를 먼저 파악 합니다.
선의 개수 ( 가로 세로 )
, , ,
위의 대입 예시를 토대로 아래와 같은 식을 생각할 수 있습니다.
을 자른 가로세로 개 수 구하는 식
그리고 행열 칸의 개수를 살표 보면 다음과 같습니다.
이 홀 수일 때, 칸의 개수 ( 행 열 )
, , ,
즉, 자른 횟수 ( 가로 세로 ) 보다
칸의 개수 ( 행 열 ) 가 한개씩 많은 것을 확인 가능합니다.
행 =
열 =
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String args[]) throws IOException{
int A = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
bw.write(sb.append(printNum(A)).toString());
bw.close();
}
static int printNum(int num) {
if(num%2!=1) { // 짝수의 경우
num = num/2;
num = num+1;
num*=num;
return num;
}else { // 홀수의 경우
int row = ((num-1)/2)+1;
int col = ((num+1)/2)+1;
return row*col;
}
}
}