BOJ-백준 14500번 테트로미노
링크 : https://www.acmicpc.net/problem/14500
✅ 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를 출력합니다.
::
'✅ 문제풀이' 카테고리의 다른 글
BOJ-백준 10989번 수 정렬하기 3 (0) | 2021.10.15 |
---|---|
BOJ-백준 2751번 수 정렬하기 2 (0) | 2021.10.14 |
BOJ-백준 3085번 사탕게임 (0) | 2021.10.07 |
BOJ-백준 6588번 골드바흐의 추측 (0) | 2021.09.20 |
BOJ-백준 17425번 약수의 합 (0) | 2021.09.18 |