Notice
Recent Posts
Recent Comments
Today
Total
04-26 17:29
Archives
관리 메뉴

Jeongchul Kim

백준 삼성 코딩 기출 문제 - 테트로미노 python 본문

Algorithm

백준 삼성 코딩 기출 문제 - 테트로미노 python

김 정출 2019. 10. 18. 00:08

백준 삼성 코딩 기출 문제 - 테트로미노 python



출처 : BAEKJOON ONLINE JUDGE

2048 (Easy) (https://www.acmicpc.net/problem/14500)


문제 설명

문제는 흔히 우리가 알고 있는 테트리스의 모양을 이용해서 주어진 맵 NxM에 어느 위치에 있던 테트로미노 하나를 놓게 됩니다. 그러면 테트로미노 안에 놓여 있는 칸에 수들의 합을 최대로 구하는 프로그램을 구하는 것입니다.

figure reference(https://www.acmicpc.net/problem/14500)


첫 번째 케이스를 예로 들면 다음과 같이 합의 최대값 19를 뽑을 수 있습니다.


모든 경우의 계산을 진행해야 합니다. 회전과 대칭에 따라 테트리스의 모양은 19개 입니다. 


문제 풀이

[1] 입력을 받습니다.

n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]


[2] 위에서 정의한 테트로미노의 19가지 모양에 대해서 4가지의 블록의 (x,y)를 정의합니다.

[3] solve() 모든 board의 위치에서 테트로미노를 놓고 합산한 값을 찾는 find()를 호출합니다.

def solve():
    for i in range (n):
        for j in range(m):
            find(i, j)


[4] find()에서는 주어진 좌표 x, y에 대해 테트로미노 19가지 모양을 놓고 계산합니다.

 - 테트로미노는 4가지 블락으로 구성되기 때문에 각 블락을 놓았을 때 x, y 좌표를 계산하고 합산 값을 구합니다.

 - 만약에 현재 위치에서 테트로미노가 board의 바깥으로 나가게 된다면 index error가 발생하므로 try, except, IndexError 처리를 합니다. except이 발생할 경우 continue로 다음 블락을 계산합니다.

 - 최종적으로 최대 값을 max로 비교하여 저장합니다.

def find(x, y):
    global answer
    for i in range(19): # 테트로미노 19가지 모양
        result = 0 # 각 테트로미노의 합산 값을 더합니다.
        for j in range(4): # 테트로미노는 4개의 블락으로 구성됩니다.
            try:
                next_x = x+tetromino[i][j][0] # 현재 위치에서 테트로미노를 놓은 x 좌표
                next_y = y+tetromino[i][j][1] # 현재 위치에서 테트로미노를 놓은 y 좌표
                result += board[next_x][next_y] # 합산 값을 구합니다.
            except IndexError: # 현재 위치에서 테트로미노가 board 밖으로 나가게 된다면 인덱스 에러 발생
                continue # 패스
        answer = max(answer, result) # 최대 값을 저장


전체 코드

n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
tetromino = [
    [(0,0), (0,1), (1,0), (1,1)], # ㅁ
    [(0,0), (0,1), (0,2), (0,3)], # ㅡ
    [(0,0), (1,0), (2,0), (3,0)], # ㅣ
    [(0,0), (0,1), (0,2), (1,0)],
    [(1,0), (1,1), (1,2), (0,2)],
    [(0,0), (1,0), (1,1), (1,2)], # ㄴ
    [(0,0), (0,1), (0,2), (1,2)], # ㄱ
    [(0,0), (1,0), (2,0), (2,1)],
    [(2,0), (2,1), (1,1), (0,1)],
    [(0,0), (0,1), (1,0), (2,0)],
    [(0,0), (0,1), (1,1), (2,1)],
    [(0,0), (0,1), (0,2), (1,1)], # ㅜ
    [(1,0), (1,1), (1,2), (0,1)], # ㅗ
    [(0,0), (1,0), (2,0), (1,1)], # ㅏ
    [(1,0), (0,1), (1,1), (2,1)], # ㅓ
    [(1,0), (2,0), (0,1), (1,1)],
    [(0,0), (1,0), (1,1), (2,1)],
    [(1,0), (0,1), (1,1), (0,2)],
    [(0,0), (0,1), (1,1), (1,2)]
]


def find(x, y):
    global answer
    for i in range(19):
        result = 0
        for j in range(4):
            try:
                next_x = x+tetromino[i][j][0] # x 좌표
                next_y = y+tetromino[i][j][1] # y 좌표
                result += board[next_x][next_y]
            except IndexError:
                continue
        answer = max(answer, result)
       
def solve():
    for i in range (n):
        for j in range(m):
            find(i, j)
           
answer = 0
solve()
print(answer)


Comments