지도는 R행 C열의 표로 이뤄져 있다. 표의 각 칸은 빌딩('#'), 주차 된 차('X'), 또는 빈 주차 공간('.')이다. 해빈이의 차는 꽤 커서 정확히 2행 2열의 칸을 차지한다.
빌딩을 부술 수는 없기 때문에 빌딩이 있는 자리에는 주차를 할 수 없다.
해빈이를 도와 가능한 주차 공간을 해빈이가 부숴야 하는 차의 수대로 모아서 보여주자.
'''
input =
4 4
#..#
..X.
..X.
#XX#
output =
1
1
2
1
0
# = 빌딩
X = 주차
. = 빈공간
해빈의 차 = 2행 2열
출력값 조건
1. '.' 4개
2. '.' 3개, 'X' 1개
3. '.' 2개, 'X' 2개
4. '.' 1개, 'X' 3개
5. 'X' 4개
'''
n, m = map(int, input().split())
parking_lot = [] # 입력값 행렬을 넣어줄 변수 리스트
breaking_car1 = 0 # 출력값 조건들에 맞는 변수 생성
breaking_car2 = 0
breaking_car3 = 0
breaking_car4 = 0
breaking_car5 = 0
check = [] # 탐색 시 값들을 담아서 확인해줄 리스트 생성
for _ in range(n): # 입력값 받기
parking_lot.append(list(input())) # 입력값을 parking_lot 리스트에 넣어준다.
for i in range(n-1): # 전체 행렬, 탐색 시 범위를 벗어나지 않도록 (n-1)로 범위 설정
for j in range(m-1): # i, j = 기준 행/열
check.clear() # 하나의 행/열이 끝날 시 확인하는 리스트를 비워준다.
for a in range(i, i + 2): # 해빈의 차(2행 2열) 만큼 탐색한다.
for b in range(j, j + 2): # a, b = 탐색 행/열
check.append(parking_lot[a][b])
if check.count('.') == 4:
breaking_car1 += 1 # 조건 1
elif check.count('.') == 3 and check.count('X') == 1:
breaking_car2 += 1 # 조건 2
elif check.count('.') == 2 and check.count('X') == 2:
breaking_car3 += 1 # 조건 3
elif check.count('.') == 1 and check.count('X') == 3:
breaking_car4 += 1 # 조건 4
elif check.count('X') == 4:
breaking_car5 += 1 # 조건 5
print(breaking_car1)
print(breaking_car2)
print(breaking_car3)
print(breaking_car4)
print(breaking_car5)
해빈의 차가 2행 2열을 차지하므로 이차원 리스트 탐색 시 2행 2열만큼 탐색한다.
출력값 조건
1. '.' 4개
2. '.' 3개, 'X' 1개
3. '.' 2개, 'X' 2개
4. '.' 1개, 'X' 3개
5. 'X' 4개
breaking_car1 = 0 # 출력값 조건들에 맞는 변수 생성
breaking_car2 = 0
breaking_car3 = 0
breaking_car4 = 0
breaking_car5 = 0
해빈이 0개 / 1개 / 2개 등 각 부숴야 할 차의 개수에 맞는 조건이 몇 번 성립되는지 출력해야 한다.
5개의 조건에 맞춰 5번의 출력값을 출력하기 위해 각 조건에 맞는 5개의 변수를 생성한다.
parking_lot = [] # 입력값 행렬을 넣어줄 변수 리스트
check = []
빌딩, 주차된 차 등의 위치를 나타내는 주차장의 입력값을 저장하기 위한 parking_lot 리스트를 생성하여 이차원 리스트로 metrix를 만들어준다.
check 리스트 변수를 생성하여 주차장을 2행 2열 단위로 문제 조건에 맞는 '.'의 개수와 'X'의 개수를 세어준다.
for i in range(n-1): # 전체 행렬, 탐색 시 범위를 벗어나지 않도록 (n-1)로 범위 설정
for j in range(m-1): # i, j = 기준 행/열
check.clear() # 하나의 행/열이 끝날 시 확인하는 리스트를 비워준다.
전체 metrix를 탐색한다.
range를 n-1, m-1로 설정하여 metrix를 벗어나지 않게 한다.
한 번의 열을 탐색한 후 check 리스트를 초기화하여 새로운 2행 2열 범위를 탐색하도록 한다.
for a in range(i, i + 2): # 해빈의 차(2행 2열) 만큼 탐색한다.
for b in range(j, j + 2): # a, b = 탐색 행/열
이는 해빈의 차가 차지할 공간인 2행 2열로 탐색하는 구문이다.
range를 i + 2, j + 2로 설정하여 2행 2열만을 탐색한다.
if check.count('.') == 4:
breaking_car1 += 1 # 조건 1
elif check.count('.') == 3 and check.count('X') == 1:
breaking_car2 += 1 # 조건 2
elif check.count('.') == 2 and check.count('X') == 2:
breaking_car3 += 1 # 조건 3
elif check.count('.') == 1 and check.count('X') == 3:
breaking_car4 += 1 # 조건 4
elif check.count('X') == 4:
breaking_car5 += 1 # 조건 5
각 5개 조건을 생성하여 '.' 'X'의 개수를 센다.
각 조건에 해당한다면 0으로 초기화한 변수들의 값이 1씩 더해진다.
print(breaking_car1)
print(breaking_car2)
print(breaking_car3)
print(breaking_car4)
print(breaking_car5)
모든 탐색이 끝난다면 각 조건에 맞는 변수들의 값을 하나씩 출력한다.
'Algorithm' 카테고리의 다른 글
[이론] 완전 탐색 Exhaustive Search (0) | 2022.08.13 |
---|---|
백준 4963 섬의 개수, 1926 그림 (1) | 2022.08.11 |
백준 2606, 11724 (0) | 2022.08.10 |
그래프(무방향, 유방향) 예문 (0) | 2022.08.09 |
백준 1436, 2309, 2798 (0) | 2022.08.08 |