백준 15700 타일 채우기 4

문제

N×M 크기의 벽에 2×1, 1×2 크기의 타일을 채우려고 한다. 겹치지 않게 놓는다면, 최대 몇 개를 채울 수 있을까?

입력
첫째 줄에 N과 M이 주어진다. (1 ≤ N, M ≤ 1,000,000,000)

출력
첫째 줄에 채울 수 있는 타일 개수의 최댓값을 출력한다.

예제 입력 1
1 2

예제 출력 1
1

예제 입력 2
1 3

예제 출력 2
1

예제 입력 3
2 2

예제 출력 3
2

예제 입력 4
3 3

예제 출력 4
4

풀이 과정

1x2 혹은 2x1 타일로 채우므로,
n, m이 둘 다 짝수이면 n과 m을 곱한 값의 절반 만큼의 타일 개수로 채울 수 있다.
n, m 둘 중 하나만 홀수이면, 홀수-1과 짝수를 곱한 값의 절반 만큼 타일로 채우고, 남은 한 줄은 짝수 만큼의 칸이 있으므로 절반으로 나눠 더한다.
n, m 둘 다 홀수이면, 무조건 한 칸이 남으므로 둘을 곱하고 하나를 뺀다. 그 절반이 타일의 수이다.
그림을 그려서 파악하면 쉽다.

코드

n, m = map(int, input().split())

result = 0
if n % 2 == 0 and m % 2 == 0:               # 둘 다 짝수일 때
    result = (n * m) // 2
elif n % 2 == 0 and m % 2 == 1:             # n이 짝수, m이 홀수일 때
    result = (n * (m - 1)) // 2 + (n // 2)
elif n % 2 == 1 and m % 2 == 0:             # n이 홀수, m이 짝수일 때
    result = (m * (n - 1)) // 2 + (m // 2)
else:                                       # 둘 다 홀수일 때
    result = (n * m - 1) // 2

print(result)

백준 15700 타일 채우기 4

좋은 웹페이지 즐겨찾기