Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](DFS) 백준 14500번 : 테트로미노(2가지 방법) 본문
728x90
<접근 방법 1>
- 'ㅜ' 모양을 제외한다면, 일반적인 dfs로 4칸을 차지하는 모양을 만들어 그 칸들의 합을 구한 뒤, answer을 sm의 최댓값으로 갱신한다.
- 'ㅜ' 모양을 따로 고려하여 answer을 갱신해준다.
def dfs(n, ci, cj, sm):
global answer
if n == 4: # 4칸의 도형이 만들어졌다면 return
answer = max(answer, sm)
return
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<M and not visited[ni][nj]:
visited[ni][nj] = 1
dfs(n+1, ni, nj, sm+board[ni][nj])
visited[ni][nj] = 0
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
answer = -1
visited = [[0]*M for _ in range(N)]
# 'ㅜ' 모양 고려 X
for i in range(N):
for j in range(M):
visited[i][j] = 1
dfs(1, i, j, board[i][j])
visited[i][j] = 0
# 'ㅜ' 모양
for i in range(1, N):
for j in range(M-2):
answer = max(answer, board[i][j]+board[i][j+1]+board[i][j+2]+board[i-1][j+1]) # 'ㅗ'
answer = max(answer, board[i-1][j]+board[i-1][j+1]+board[i-1][j+2]+board[i][j+1]) # 'ㅜ'
for i in range(N-2):
for j in range(M-1):
answer = max(answer, board[i][j]+board[i+1][j]+board[i+2][j]+board[i+1][j+1]) # 'ㅏ'
answer = max(answer, board[i][j+1]+board[i+1][j+1]+board[i+2][j+1]+board[i+1][j]) # 'ㅓ'
print(answer)
<접근 방법 2>
- 테트로미노는 4칸을 차지하는 도형으로 dfs를 통해 모든 가능한 방법에 접근해본다.
- 'ㅜ' 모양으로 인해 예외의 경우가 생기므로, 이에 대한 처리도 함께 해준다. (dfs 내에서 n==2인 경우)
- dfs를 통해 깊이가 4일때까지 들어가며 방문체크와 그에 맞는 칸의 값인 board[ni][nj] 값을 sm에 더해주고, 최종적으로
answer를 최댓값일 경우로 갱신해준다.
def dfs(n, ci, cj, sm):
global answer
if n == 4: // 선택한 칸이 4개가 되었다면 return
answer = max(answer, sm) # answer를 최댓값으로 갱신
return
for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
ni = ci + di
nj = cj + dj
if 0<=ni<N and 0<=nj<M and not visited[ni][nj]:
visited[ni][nj] = 1
if n == 2: # 'ㅜ'의 경우를 고려하기 위한 처리
dfs(n+1, ci, cj, sm + board[ni][nj])
visited[ni][nj] = 0
dfs(n+1, ni, nj, sm + board[ni][nj])
visited[ni][nj] = 0
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
answer = -1
visited = [[0]*M for _ in range(N)]
for i in range(N):
for j in range(M):
visited[i][j] = 1
dfs(1, i, j, board[i][j])
visited[i][j] = 0
print(answer)
이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](DFS) 백준 15683번 : 감시 (0) | 2024.03.01 |
---|---|
[Python](BFS&DFS / BFS&Itertools) 백준 14502번 : 연구소 (2가지 방법) (2) | 2024.02.05 |
[Python](시뮬) 백준 14499번 : 주사위 굴리기 (2) | 2024.02.03 |
[Python](시뮬) 백준 3190번 : 뱀 (2) | 2024.01.30 |
[Python](시뮬) 백준 21610번 : 마법사 상어와 비바라기 (2) | 2024.01.29 |