백준 baekjoon
[백준 3085] 사탕게임
니블
2023. 4. 21. 02:01
04-20
풀이
인접한 노드를 구하는 방법을 찾아보다가
'델타를 이용한 상하좌우 노드 탐색' 을 해보자고 생각했다. 그전에 문제들도 델타를 이용한것처럼 보였는데 이해가 잘 되지않았다. 오늘은 한 티스토리 글을 보고 좀 이해가 가기시작했다.
코드는 약간 그럴싸 했지만 당연 답지를 볼수밖에
그래도 델타부분은 비슷했다 ㅎㅎ
코드
#최대 개수 세기
def count_candy():
row_cnt,col_cnt,row_max,col_max =1,1,-1e9,-1e9
#행 계산
for i in range(n):
for j in range(n-1):
#행 기준 동일한 색상이라면
if candy[i][j] == candy[i][j+1]:
row_cnt+=1
else:
row_cnt =1
row_max=max(row_cnt,row_max)
row_cnt =1
#열 계산
for j in range(n):
for i in range(n-1):
#열 기준 동일한 색상이라면
if candy[i][j]==candy[i+1][j]:
col_cnt +=1
else:
col_cnt=1
col_max=max(col_cnt,col_max)
col_cnt=1
#먹을수 있는 최대 사탕개수 구하기
answer = max(row_max,col_max)
return answer
ans=0
n =int(input())
candy = [list(input()) for _ in range(n)]
'''
dx=[0,0,-1,1] # 좌우
dy=[-1,1,0,0] # 상하
'''
steps =[[-1,0],[1,0],[0,-1],[0,1]] # 상,하,좌,우
for i in range(n):
for j in range(n):
for k in range(4):
nx = i+steps[k][0]
ny = j+steps[k][1]
#보드를 벗어나면 건너뛰기
if nx<0 or nx>=n or ny<0 or ny>=n:
continue
#인접한 두 칸이 다른 색의 사탕이라면
if candy[i][j] != candy[nx][ny]:
candy[nx][ny], candy[i][j] = candy[i][j],candy[nx][ny]
#이전의 사탕 개수와 비교하며 최댓값 생성
ans = max(ans,count_candy())
#인접한 두 칸 원위치
candy[i][j], candy[nx][ny]=candy[nx][ny], candy[i][j]
print(ans)
다른코드들도 좀 찾아봐야겠다.