728x90
시간 제한 2초, 메모리 제한 128MB
# 조건
- 갤러리의 지도는 M*N의 정사각형 격자로 표현될 수 있다.
- 어떤 정사각형들은 벽으로 구성되어 있고, 다른 정사각형들은 빈 공간으로 구성되어 있다.
- 벽을 회색, 빈 공간을 흰색으로 표현하면 다음 그림과 같다.

- 갤러리에 그림을 걸려고 한다.
- 그림의 길이는 정사각형의 변의 길이의 두 배이다.
- 반드시 빈 공간과 인접해 있는 벽에만 그림을 걸 수 있으며, 그림들은 서로 겹칠 수 없다.
- 갤러리의 맵이 주어졌을 때, 최대로 걸 수 있는 그림의 개수를 출력하는 프로그램을 작성하시오.
입력
- 첫째 줄에 갤러리의 세로 길이 M과 가로 길이 N이 주어진다. (1 ≤ M, N ≤ 1,000)
- 다음 M개의 줄에는 각각 N개의 문자가 주어진다.
- 문자는 'X' 또는 '.'이며 'X'는 벽을, '.'는 빈 공간을 나타낸다.
- 입력되는 모든 데이터에서 적어도 첫 줄과 마지막 줄, 첫 열과 마지막 열은 모두 벽이다.
출력
- 최대 그림 개수를 출력한다.
# 접근 방법
- 처음 문제 이해가 조금 어려웠다.
- 문제의 핵심은 빈 공간과 인접한 벽에만 그림을 걸 수 있고, 그림의 길이는 2라는 점이었다.
- 또한, 겹치게 걸 수 없는 것을 고려하여 아래와 같은 로직으로 구현하였다.
- 그림을 걸 수 있는 조건을 아래와 같이 두었다.
- 현재 위치가 벽이고 오른쪽도 벽일 때, 아래 2칸이 빈 공간인 경우
- 현재 위치가 빈 공간이고 오른쪽도 빈 공간 일 때, 아래 2칸이 벽인 경우
- 또한 현재 벽에서 그림을 걸었다면 다음 열을 +2를 한 뒤 진행해준다.
- 열을 확인하는 것도 마찬가지이지만 확인하는 로직을 같이 사용하기 위하여 zip으로 arr을 뒤집어 준 후 카운트 하였다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
def check(limit1, limit2):
global result, arr
for i in range(limit1-1):
j = 1
while j < limit2 - 2:
if arr[i][j] == 'X' and arr[i][j+1] == 'X':
if arr[i+1][j] == '.' and arr[i+1][j+1] == '.':
result +=1
j += 2
continue
elif arr[i][j] == '.' and arr[i][j+1] == '.':
if arr[i+1][j] == 'X' and arr[i+1][j+1] == 'X':
result += 1
j += 2
continue
j += 1
M, N = map(int, input().split())
arr = []
for _ in range(M):
arr.append(list(input().strip()))
result = 0
check(M, N)
arr = list(zip(*arr))
check(N, M)
print(result)
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 11663번] 파이썬 - 선분 위의 점 (0) | 2024.07.01 |
---|---|
[백준 21921번] 파이썬 - 블로그 (1) | 2024.06.08 |
[백준 16508번] 파이썬 - 전공책 (0) | 2024.05.12 |
[백준 1747번] 파이썬- 소수&팰린드롬 (0) | 2024.04.28 |
[백준 - 2559번] 파이썬 - 수열 (1) | 2024.04.28 |