Algorithm

백준 2897 몬스터 트럭

김디니 2022. 8. 11. 00:34

지도는 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