실버 1 https://www.acmicpc.net/problem/3019 

 

3019번: 테트리스

테트리스는 C열 필드위에서 플레이하는 유명한 게임이다. 필드의 행의 수는 무한하다. 한 번 움직일 때, 아래와 같은 일곱가지 블록 중 하나를 필드에 떨어뜨릴 수 있다. 블록을 떨어뜨리기 전에

www.acmicpc.net

 

 

 

[Python]

 

풀이 방법:

 

우선, 각 블록마다 회전하여 필드에 떨어트렸을때, 딱 맞게 떨어지는 필드의 높이를 숫자로 표현해본다.

 

1번블록

ㅣ : 한칸 넓이 이므로, 모든 경우에 가능. 즉 c만큼의 경우의 수. 

ㅡ : 넓이가 4이므로, 필드에서 4칸연속 높이가 같은 곳이 있는 경우의 수.  0000

 

2번블록

ㅁ : 넓이가 2이므로, 필드에서 2칸연속 높이가 같은 곳이 있는 경우의 수. 00

 

3번블록

넓이가 3인데 가장 오른쪽 아래를 보면 비어있으므로, 필드에서 2칸연속 높이가 같으면서 3번째칸은 높이가 1인 경우의 수. 001

넓이가 2인데 가장 왼쪽 아래를 보면 비어있으므로, 1번째칸은 높이가 1이면서 다음은 한칸 낮은 경우의 수.10

 

7번 블록까지 숫자로 표현한다.

블럭의 경우마다 나누어 for문으로 필드의 높이를 비교하여 ans를 증가해주면 된다.

 

  • 각 블록마다 회전하여 필드에 떨어트렸을때, 딱 맞게 떨어지는 필드의 높이를 숫자로 표현
  • 각 블록마다 회전하여 놓았을때 딱 맞을 수 있는 높이의 경우를 구해줌
  • 그 경우에 해당하면 ans를 1씩 증가시킴

 

 

코드:

import sys
input = sys.stdin.readline

c,block = map(int,input().split())
fd = list(map(int,sys.stdin.readline().split()))

ans=0
if block == 1:
    #ㅣ모양의 블럭은 모든열에 놓을 수 있기 때문에 c만큼 경우의 수를 더함
    ans += c  #0
    for i in range(c-3):
        #0000
        if fd[i] == fd[i + 1] and fd[i + 1] == fd[i + 2] and fd[i + 2] == fd[i + 3]:
            ans+=1
if block == 2:
    for i in range(c-1):
        #00
        if fd[i] == fd[i + 1]:
            ans+=1
if block == 3:
    for i in range(c-2):
        #001
        if fd[i] == fd[i + 1] and fd[i + 1] == fd[i + 2] - 1:
            ans+=1
    for i in range(c-1):
        #10
        if fd[i] == fd[i + 1] + 1:
            ans+=1
if block == 4:
    for i in range(c-2):
        #100
        if fd[i] == fd[i + 1] + 1 and fd[i + 1] == fd[i + 2]:
            ans+=1
    for i in range(c-1):
        #01
        if fd[i] == fd[i + 1] - 1:
            ans+=1
if block == 5:
    for i in range(c-2):
        #000
        if fd[i] == fd[i + 1] and fd[i + 1] == fd[i + 2]:
            ans+=1
        #101
        if fd[i] == fd[i + 1] + 1 and fd[i + 1] == fd[i + 2] - 1:
            ans+=1
    for i in range(c-1):
        #10
        if fd[i] == fd[i + 1] - 1:
            ans+=1
        #10
        if fd[i] == fd[i + 1] + 1:
            ans+=1
if block == 6:
    for i in range(c-2):
        #000
        if fd[i]==fd[i+1] and fd[i+1]==fd[i+2]:
            ans+=1
        #011
        if fd[i]==fd[i+1]-1 and fd[i+1]==fd[i+2]:
            ans+=1
    for i in range(c-1):
        #00
        if fd[i]==fd[i+1]:
            ans+=1
        #20
        if fd[i]==fd[i+1]+2:
            ans+=1
if block == 7:
    for i in range(c-2):
        #000
        if fd[i]==fd[i+1] and fd[i+1]==fd[i+2]:
            ans+=1
        #110
        if fd[i]==fd[i+1] and fd[i+1]==fd[i+2] + 1:
            ans+=1
    for i in range(c-1):
        #02
        if fd[i]==fd[i+1]-2:
            ans+=1
        #00
        if fd[i]==fd[i+1]:
            ans+=1

print(ans)

 

+ Recent posts