알고리즘
[알고리즘] 사탕게임 - dfs
j9972
2024. 6. 13. 22:58
728x90
1. 문제
https://www.acmicpc.net/problem/3085
2. 풀이
중요 point 1) n*n 모든 값들을 4가지 방면으로 switching 해본다.
-> change() 로 값이 다른지 확인하고 boolean으로 응답하기
중요 point 2) switching이 된다면, 같은 값을 가진 가장 긴 행/열을 구할때, 현재 2차원 index로부터 뒤의 모든 값들을 확인하지 말고 바로 앞에 있는 값이랑만 비교하면서 max값, tmp값 update 해주기
-> calc() 참조!
중요 point 3) switching 하고 max_val 값 update했으면, 다시 원래자리로 복구해주기
3. 코드
n = int(input())
arr = [
list(input())
for _ in range(n)
]
dxs, dys = [-1,1,0,0],[0,0,-1,1]
def in_range(x,y):
return 0<=x<n and 0<=y<n
def change(x,y, nx,ny):
if not in_range(nx,ny):
return False
if arr[x][y] != arr[nx][ny]:
return True
return False
def calc():
res = 0
# 행
for i in range(n):
tmp = 1
for j in range(1, n):
if arr[i][j] == arr[i][j-1]:
tmp += 1
res = max(res, tmp)
else:
tmp = 1
# 열
for j in range(n):
tmp = 1
for i in range(1, n):
if arr[i][j] == arr[i-1][j]:
tmp += 1
res = max(res, tmp)
else:
tmp = 1
return res
max_val = 0
for x in range(n):
for y in range(n):
for dx,dy in zip(dxs, dys):
nx,ny = x + dx, y + dy
if not change(x,y, nx,ny):
continue
arr[x][y], arr[nx][ny] = arr[nx][ny], arr[x][y]
max_val = max(max_val, calc())
arr[nx][ny], arr[x][y] = arr[x][y], arr[nx][ny]
print(max_val)