본문 바로가기
✅ 문제풀이

BOJ-백준 14500번 테트로미노

by dogfoot.dev 2021. 10. 11.
728x90
728x90

BOJ-백준 14500번 테트로미노

링크 : https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

 

✅ Python 정답 코드 입니다. 더보기 클릭!

더보기
h, w = map(int, input().split())
field = []
for i in range(h):
  field.append(list(map(int,input().split())))
# 입력 완료
def T_one():
  max_score = 0
  # ㅡ
  for i in range(h):
    for j in range(w):
      if j+4 > w:
        break
      else:
        t = field[i][j:j+4]
        score=sum(t)
        if max_score < score:
          max_score = score
        #print(t, score, max_score)
  # ㅣ 
  for i in range(h):
    if i+4 > h:
        break
    for j in range(w):
      t = []
      for x in range(4):
        t.append(field[i:i+4][x][j])
      score = sum(t)
      if max_score < score:
          max_score = score
      #print(t,score, max_score)
  return max_score

def T_two():
  max_score =0
  # ┐
  # │
  #print("ㄱ")
  for i in range(h-2):
    for j in range(w-1):
      t = field[i][j:j+2]
      t.append(field[i+1][j+1])
      t.append(field[i+2][j+1])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ㅡ┐
  #print("ㅡ┐")
  for i in range(h-1):
    for j in range(w-2):
      t = field[i][j:j+3]
      t.append(field[i+1][j+2])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # │
  # L
  #print("L")
  for i in range(h-2):
    for j in range(w-1):
      t = []
      for x in range(3):
        t.append(field[i:i+3][x][j])
      t.append(field[i+2][j+1])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # └──
  #print("└──")
  for i in range(h-1):
    for j in range(w-2):
      t = field[i+1][j:j+3]
      t.append(field[i][j])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ┌
  # │
  #print("┌")
  for i in range(h-2):
    for j in range(w-1):
      t = field[i][j:j+2]
      t.append(field[i+1][j])
      t.append(field[i+2][j])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ┌─ㅡ
  #print("┌─ㅡ")
  for i in range(h-1):
    for j in range(w-2):
      t = field[i][j:j+3]
      t.append(field[i+1][j])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ──┘
  #print("──┘")
  for i in range(h-1):
    for j in range(w):
      if j+3 > w:
        break
      else:
        t = field[i+1][j:j+3]
        t.append(field[i][j+2])
        score=sum(t)
        if max_score < score:
          max_score = score
        #print(t, score, max_score)
  # │
  # ┘
  #print("┘")
  for i in range(h-2):
    for j in range(1,w):
      t = []
      for x in range(3):
        t.append(field[i:i+3][x][j])
      t.append(field[i+2][j-1])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  return max_score


def T_three():
  max_score = 0
  # ㅁ
  for i in range(h-1):
    for j in range(w-1):
      t = field[i][j:j+2]
      t.append(field[i+1][j])
      t.append(field[i+1][j+1])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  return max_score

def T_four():
  max_score =0
  # ㅜ
  for i in range(h-1):
    for j in range(w):
      if j+3 > w:
        break
      else:
        t = field[i][j:j+3]
        t.append(field[i+1][j+1])
        score = sum(t)
        if max_score < score:
          max_score = score
      #print(t, score, max_score)
  # ㅗ
  for i in range(h-1):
    for j in range(w):
      if j+3 > w:
        break
      else:
        t = field[i+1][j:j+3]
        t.append(field[i][j+1])
        score = sum(t)
        if max_score < score:
          max_score = score
      #print(t, score, max_score)
  # ㅓ
  for i in range(1,h-1):
    for j in range(w-1):
      t = []
      for x in range(3):
        t.append(field[i-1:i+3][x][j+1])
      t.append(field[i][j])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t,score, max_score)
  # ㅏ
  for i in range(h-2):
    for j in range(w-1):
      t = []
      for x in range(3):
        t.append(field[i:i+3][x][j])
      t.append(field[i+1][j+1])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t,score, max_score)
  return max_score

def T_five():
  # ┖┐
  max_score = 0
  for i in range(h-2):
    for j in range(w-1):
      t = []
      for x in range(2):
        t.append(field[i:i+2][x][j])
      for x in range(2):
        t.append(field[i+1:i+3][x][j+1])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t,score, max_score)
  # _┏
  for i in range(h-1):
    for j in range(1,w-1):
      t = field[i][j:j+2]
      t.append(field[i+1][j-1])
      t.append(field[i+1][j])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t,score, max_score)
  # ┌┙
  for i in range(h-2):
    for j in range(1,w):
      t=[]
      for x in range(2):
        t.append(field[i:i+2][x][j])
      for x in range(2):
        t.append(field[i+1:i+3][x][j-1])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t,score, max_score)
  # ┓_
  for i in range(h-1):
    for j in range(w-2):
      t = field[i][j:j+2]
      t.append(field[i+1][j+1])
      t.append(field[i+1][j+2])
      score = sum(t)
      if max_score < score:
        max_score = score
      #print(t,score, max_score)
  return max_score

result = 0 
current_score=T_one()
if current_score > result:
  result = current_score
current_score=T_two()
if current_score > result:
  result = current_score
current_score=T_three()
if current_score > result:
  result = current_score
current_score=T_four()
if current_score > result:
  result = current_score
current_score=T_five()
if current_score > result:
  result = current_score
print(result)

📌 해설

테트로미노를 모두 셋팅해주고 T_one~T_five()를 만들어 주었습니다. 각 T_one~five()함수에서 테트로미노의 회전, 대칭에대한 최댓값을 갱신합니다. 

T_one()~T_five()를 차례로 실행하고 각 함수가 끝날때 마다 최댓값을 갱신하였습니다.

 

 

🚩주의

회전, 대칭의 경우의 수가 가장 많이 나오는 (ㄴ)을 주의하며 해결합니다. 

 

h, w = map(int, input().split())
field = []
for i in range(h):
  field.append(list(map(int,input().split())))
# 입력 완료

1. 필요한 데이터를 입력받습니다. 가로(w), 세로(h), 테트로미노가 놓일 종이(field)

 

def T_one():
  max_score = 0
  # ㅡ
  for i in range(h):
    for j in range(w):
      if j+4 > w:
        break
      else:
        t = field[i][j:j+4]
        score=sum(t)
        if max_score < score:
          max_score = score
        #print(t, score, max_score)
  # ㅣ 
  for i in range(h):
    if i+4 > h:
        break
    for j in range(w):
      t = []
      for x in range(4):
        t.append(field[i:i+4][x][j])
      score = sum(t)
      if max_score < score:
          max_score = score
      #print(t,score, max_score)
  return max_score

2. T_one()은 'ㅡ' 모양의 테트로미노를 옮기며(회전, 대칭 : 'ㅣ') 최대값을 반환하는 함수입니다. 

2-1. 이중for문을 통해 옮깁니다.

2-2. t에 테트로미노에 들어온 점수를 옮깁니다.

2-3. sum(t)를 점수(score)로 저장한 뒤 최대값인지 확인하고 갱신합니다. 

2-4. 'ㅡ' 가 회전한 테트로미노 형태인 'ㅣ' 도 같은 방법으로 score를 합산한 뒤, 최대값인지 확인하고 갱신합니다.

2-5. 최대값 max_score를 반환합니다. 

 

def T_two():
  max_score =0
  # ┐
  # │
  #print("ㄱ")
  for i in range(h-2):
    for j in range(w-1):
      t = field[i][j:j+2]
      t.append(field[i+1][j+1])
      t.append(field[i+2][j+1])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ㅡ┐
  #print("ㅡ┐")
  for i in range(h-1):
    for j in range(w-2):
      t = field[i][j:j+3]
      t.append(field[i+1][j+2])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # │
  # L
  #print("L")
  for i in range(h-2):
    for j in range(w-1):
      t = []
      for x in range(3):
        t.append(field[i:i+3][x][j])
      t.append(field[i+2][j+1])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # └──
  #print("└──")
  for i in range(h-1):
    for j in range(w-2):
      t = field[i+1][j:j+3]
      t.append(field[i][j])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ┌
  # │
  #print("┌")
  for i in range(h-2):
    for j in range(w-1):
      t = field[i][j:j+2]
      t.append(field[i+1][j])
      t.append(field[i+2][j])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ┌─ㅡ
  #print("┌─ㅡ")
  for i in range(h-1):
    for j in range(w-2):
      t = field[i][j:j+3]
      t.append(field[i+1][j])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  # ──┘
  #print("──┘")
  for i in range(h-1):
    for j in range(w):
      if j+3 > w:
        break
      else:
        t = field[i+1][j:j+3]
        t.append(field[i][j+2])
        score=sum(t)
        if max_score < score:
          max_score = score
        #print(t, score, max_score)
  # │
  # ┘
  #print("┘")
  for i in range(h-2):
    for j in range(1,w):
      t = []
      for x in range(3):
        t.append(field[i:i+3][x][j])
      t.append(field[i+2][j-1])
      score=sum(t)
      if max_score < score:
        max_score = score
      #print(t, score, max_score)
  return max_score

3.  '┐(세로 획이 김)' 은 회전, 대칭 형태가  'ㅡ┐(가로 획이 김)' ,'┌(세로 획이 김)', '┌ㅡ(가로 획이 김)' 

'L(세로 획이 김)' , '└ㅡ(가로 획이 김)', ' ┘(세로 획이 김)', '─┘(가로 획이 김)' 가 있습니다. 

해당 경우의 수를 모두 확인하여 최대값을 갱신하고 반환합니다. 

 

4. T_three, T_four, T_five()도 마찬가지로 모든 경우의 수를 고려하여 최대값을 갱신하는 함수를 만듭니다.

 

result = 0 
current_score=T_one()
if current_score > result:
  result = current_score
current_score=T_two()
if current_score > result:
  result = current_score
current_score=T_three()
if current_score > result:
  result = current_score
current_score=T_four()
if current_score > result:
  result = current_score
current_score=T_five()
if current_score > result:
  result = current_score
print(result)

5. T_one() ~ T_five() 를 차례대로 호출하고 최대값(result)를 갱신합니다.

6. T_five()까지 호출 되면 result를 출력합니다.

 

:: 

 

 

 

728x90
반응형