본문 바로가기

코딩테스트/파이썬

백준 18808번 스티커 붙이기

728x90

문제 설명

 

해당 스티커를 붙일 수 있는지 확인한다. arr은 해당 스티커를 의미하고 plist에 스티커의 좌표를 넣어준다.

 

 

flag는 스티커를 붙일 수 있는지 판별하는 bool형 변수다. 이중 for문을 통해 처음부터 끝의 좌표들을 검사해 스티커를 붙일 수 있는지 확인한다. 확인해야 하는 경우의 수는 총 세 가지다. 스티커를 붙일 때 가로측 범위를 벗어나는지, 세로측 범위를 벗어나는지, 이미 스티커가 붙여있는지를 확인하면 된다. 만약 붙일 수 없는 경우 스티커를 90도 회전시키고 plist를 초기화한다.

 

 

해당 내용을 3번 더 반복한다.

 

전체 코드

laptop = []
M = 0
N = 0

def turn(arr):
    n = len(arr)
    m = len(arr[0])
    tmp = []
    for j in range(m):
        tmp2 = []
        for i in reversed(range(n)):
            tmp2.append(arr[i][j])
        tmp.append(tmp2)
    return tmp

def func(arr):
    global laptop
    global N
    global M
    plist = []
    
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            if arr[i][j] == 1:
                plist.append([i,j])

    flag = True
    for i in range(N):
        for j in range(M):
            for k in range(len(plist)):
                if plist[k][0] + i >= N:
                    flag = False
                    break
                if plist[k][1] + j >= M:
                    flag = False
                    break
                if laptop[i+plist[k][0]][j+plist[k][1]] == 1:
                    flag = False
                    break
                flag = True
            if flag:
                for k in range(len(plist)):
                    laptop[i+plist[k][0]][j+plist[k][1]] = 1
                return
                
    arr = turn(arr)
    plist.clear()
    
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            if arr[i][j] == 1:
                plist.append([i,j])
                
    for i in range(N):
        for j in range(M):
            copy_plist = [item[:] for item in plist]
            for k in range(len(copy_plist)):
                if copy_plist[k][0] + i >= N:
                    flag = False
                    break
                if copy_plist[k][1] + j >= M:
                    flag = False
                    break
                if laptop[i+copy_plist[k][0]][j+copy_plist[k][1]] == 1:
                    flag = False
                    break
                flag = True
            if flag:
                for k in range(len(copy_plist)):
                    laptop[i+copy_plist[k][0]][j+copy_plist[k][1]] = 1
                return
                
    arr = turn(arr)
    plist.clear()
    
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            if arr[i][j] == 1:
                plist.append([i, j])
                
    for i in range(N):
        for j in range(M):
            copy_plist = [item[:] for item in plist]
            for k in range(len(copy_plist)):
                if copy_plist[k][0] + i >= N:
                    flag = False
                    break
                if copy_plist[k][1] + j >= M:
                    flag = False
                    break
                if laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] == 1:
                    flag = False
                    break
                flag = True
            if flag:
                for k in range(len(copy_plist)):
                    laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] = 1
                return
                
    arr = turn(arr)
    plist.clear()
    
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            if arr[i][j] == 1:
                plist.append([i, j])
                
    for i in range(N):
        for j in range(M):
            copy_plist = [item[:] for item in plist]
            for k in range(len(copy_plist)):
                if copy_plist[k][0] + i >= N:
                    flag = False
                    break
                if copy_plist[k][1] + j >= M:
                    flag = False
                    break
                if laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] == 1:
                    flag = False
                    break
                flag = True
            if flag:
                for k in range(len(copy_plist)):
                    laptop[i + copy_plist[k][0]][j + copy_plist[k][1]] = 1
                return
    return


def main():
    global laptop
    global M,N
    N,M,K = map(int,input().split())

    laptop = [[0]*M for _ in range(N)]

    while K:
        K -= 1
        paper = []
        n, m = map(int,input().split())
        for i in range(n):
            paper.append(list(map(int,input().split())))
        func(paper)

    count = 0
    for i in range(N):
        for j in range(M):
            if laptop[i][j]:
                count += 1
    print(count)
    return

if __name__ == "__main__":
    main()
728x90
반응형

'코딩테스트 > 파이썬' 카테고리의 다른 글

백준 3190번 뱀  (0) 2021.02.11
백준 11559번 Puyo Puyo  (0) 2021.02.09
백준 12100번 2048(Easy)  (0) 2021.02.07
백준 15683번 감시  (0) 2021.02.06
백준 1799번 비숍  (0) 2021.02.04