[BOJ] 3019 테트리스

nunddu·2020년 8월 3일
0

https://www.acmicpc.net/problem/3019

문제 요약

  • 테트리스 블록을 떨어트렸을 때 블록-블록 또는 바닥면-블록 간에 공백이 생기면 안된다.
  • 블록 모양과 테트리스 상태가 주어질 때 공백이 생기지 않게 테트리스 블록을 쌓을 수 있는 경우의 수를 출력하라.

접근

  • 생각의 흐름
    1. NxM 형태의 2차원 리스트를 만들고 맵의 상태를 반영하자.
    2. 테트리스 블록 별로 90°, 180°, 270° 회전한 2차원 리스트를 만들자
      이때부터 뭔가 이상하다고 생각함
  • 다시 생각
    1. 테트리스 블록을 떨어뜨린 후 블록을 기준으로 기존 맵과 닿는 면을 기준으로 공백이 있는지 파악하면된다.
    2. 테트리스 블록별로 회전한 상태를 기존 맵과 비교하여 공백이 없으면 +1
      • 1번 블록의 경우 ㅣ와 같은 모양일 때는 모든 열에 위치하더라도 공백이 없으므로 answer+=c, ㅡ 와 같은 모양일 때는 인덱스 0부터 c-3까지 4개의 열을 비교하여 값이 동일할 경우 answer+=1
      • 2번 블록의 경우 회전 상태가 모두 동일 하므로 인덱스 0부터 c-1 사이 구간에서 2개의 열을 비교하여 값이 동일할 경우 answer+=1
      • 3번 블록의 경우 회전에 따라 두 가지의 모양을 가질 수 있고 각각 0부터 c-2 구간, 0부터 c-1 구간에서 기존 맵과 빈틈없이 맞닿는지 확인한다.


      • 이와 같은 방법으로 7번 블록까지 적용

코드

가독성은 떨어지지만 성능면에서는 이 접근 방법이 좋은 것 같다.

c,p=map(int,input().split())
base=list(map(int,input().split()))
answer=0
if p==1: 
    answer+=c
    for i in range(c-3):
        if base[i]==base[i+1] and base[i+1]==base[i+2] and base[i+2]==base[i+3]:
            answer+=1
elif p==2: 
    for i in range(c-1):
        if base[i]==base[i+1]:
            answer+=1
elif p==3:
    for i in range(c-2):
        if base[i]==base[i+1] and base[i+1]==base[i+2]-1:
            answer+=1
    for i in range(c-1):
        if base[i]==base[i+1]+1:
            answer+=1
elif p==4:
    for i in range(c-2):
        if base[i]==base[i+1]+1 and base[i+1]==base[i+2]:
            answer+=1
    for i in range(c-1):
        if base[i]+1==base[i+1]:
            answer+=1
elif p==5:
    for i in range(c-2):
        if base[i]==base[i+1] and base[i+1]==base[i+2]:
            answer+=1
        elif base[i]==base[i+2] and base[i+1]+1==base[i]:
            answer+=1
    for i in range(c-1):
        if base[i]+1==base[i+1]:
            answer+=1
        elif base[i]==base[i+1]+1:
            answer+=1
elif p==6:
    for i in range(c-2):
        if base[i]==base[i+1] and base[i]==base[i+2]:
            answer+=1
        if base[i]+1==base[i+1] and base[i+1]==base[i+2]:
            answer+=1
    for i in range(c-1):
        if base[i]-2==base[i+1]:
            answer+=1
        elif base[i]==base[i+1]:
            answer+=1
elif p==7:
    for i in range(c-2):
        if base[i]==base[i+1] and base[i]==base[i+2]:
            answer+=1
        elif base[i]==base[i+1] and base[i]==base[i+2]+1:
            answer+=1
    for i in range(c-1):
        if base[i]+2==base[i+1]:
            answer+=1
        elif base[i]==base[i+1]:
            answer+=1 
print(answer)

0개의 댓글