SWEA 12052. 부서진 타일 (Python)(D4)

Wjong·2023년 2월 15일
0

swea

목록 보기
34/36

문제

N X M 격자에 일부 타일이 부서졌다. 당신은 이 부서진 타일을 새로운 2 X 2 격자 크기의 타일로 대체하려고 한다. 이 때 대체하는 타일은 원래 부서진 타일이 있던 위치에 올바른 방향으로 (기울여서는 안된다) 배치할 것이며, 부서지지 않은 타일을 덮으면 안된다. 이러한 대체가 가능할까?

[입력]
첫 번째 줄에 테스트 케이스의 수 TC가 주어진다. 이후 TC개의 테스트 케이스가 새 줄로 구분되어 주어진다. 각 테스트 케이스는 다음과 같이 구성되었다.
    ∙ 첫 번째 줄에 정수 N, M이 주어진다. (1 ≤ N, M ≤ 50)
    ∙ 이후 N개의 줄에 타일의 상태를 나타내는 길이 M의 문자열이 주어진다. 부서진 타일이면 ‘#’, 정상 타일이면 ‘.’ 로 표시된다.

[출력]
각 테스트 케이스 마다 한 줄씩, 가능하다면 “YES”, 불가능하다면 “NO” 를 출력하라.

풀이

깨진 타일들을 2x2의 사이즈로 모두 채울 수 있는지 확인하는 문제이다.

  • 2차원배열로 주어진 타일들을 순회
  • 순회도중 해당위치가 깨진타일일 경우
    - 해당위치로부터 오른쪽, 아래, 오른쪽아래가 2차원배열 범위 안이고 4개타일 전부 깨져있을경우 해당타일들을 전부 '.'로 변경
    - 아닐경우(4칸이 범위 밖이거나, 어느하나라도 안깨져있을경우), 순회종료 및 "NO" 리턴
res=[]
def check(x,y):
    if x<(N-1) and y<(M-1): # 범위안인지
        for i in range(2): # 4칸전부 깨져있는지
            for j in range(2):
                if li[x+i][y+j]!='#':
                    return False
        return True
    else:
        return False

for m in range(int(input())):
    tmp="YES" # 기본값은 YES
    N,M=map(int,input().split())
    li=[]
    for i in range(N):
        li.append(list(input()))
    for i in range(N):
        for j in range(M):
            if li[i][j]=='#':
                if i<(N-1) and j<(M-1) and check(i,j): #4칸 타일들이 깨져있고 범위안에 있는지 확인
                    for k in range(2): # 타일 채워주기
                        for m in range(2): 
                            li[i+k][j+m]='.'
                else:
                    tmp="NO"
                    break
        if tmp=="NO":
            break
    res.append(tmp)
for i in range(len(res)):
    print("#%d %s"%(i+1,res[i]))
profile
뉴비

0개의 댓글