자료구조 & 알고리즘/백준(Baekjoon)
백준3085(파이썬) - 사탕 게임
resilient
2021. 6. 21. 22:27
728x90
반응형
https://www.acmicpc.net/problem/3085
3085번: 사탕 게임
예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.
www.acmicpc.net
- 먼저 이문제는 탐색 문제이다.
- 좌우 또는 상하로 한번 자리를 옮긴 후, 한번 옮길 때마다 옮긴 data를 탐색하면서 같은 사탕 개수의 최대값을 갱신해주면 되는 문제이다.
- 간단하게 설명하면, 자리바꾸고 -> 탐색해서 최댓값 갱신 -> 자리원위치 -> 자리바꾸고 -> 탐색해서 최댓값 갱신 이 과정을 반복하면서 최댓값을 갱신해 주면 된다.
- count함수는 행, 열을 탐색하면서 같은 사탕이 나오는 갯수의 최대값을 반환해주는 함수를 만들었고
- 이중 for문으로 자리바꾸기와 자리원위치를 구현해주었다.
- 처음에는 자리바꾸고 자리원위치를 함수로 구현했으나 계속 에러가 나서 이중for문으로 구현했다.
import sys
input = sys.stdin.readline
# count는 data에서 오른쪽,아래로 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수
def count(data):
Max = 1
for i in range(n):
cnt = 1
for j in range(1,n):
if data[i][j] == data[i][j-1]:
cnt += 1
else:
cnt = 1
Max = max(Max,cnt)
cnt = 1
for j in range(1,n):
if data[j][i] == data[j-1][i]:
cnt += 1
else:
cnt = 1
Max = max(Max,cnt)
return Max
# 오른쪽 하고 아래부분만 신경써주면된다.
n = int(input())
data = [list(input()) for _ in range(n)]
ans = 0
for i in range(n):
for j in range(n):
# 열 바꾸기
if j+1 < n:
# 인점한 것과 바꾸기
data[i][j], data[i][j+1] = data[i][j+1], data[i][j]
temp=count(data)
ans = max(ans,temp)
# 바꿨던 것을 다시 원래대로 돌려놓기
data[i][j], data[i][j+1] = data[i][j+1], data[i][j]
# 행 바꾸기
if i+1 < n:
# 인점한 것과 바꾸기
data[i][j], data[i+1][j] = data[i+1][j], data[i][j]
temp=count(data)
ans = max(ans,temp)
# 바꿨던 것을 다시 원래대로 돌려놓기
data[i][j], data[i+1][j] = data[i+1][j], data[i][j]
print(ans)
# 위치 바꾸는거도 함수로 처리했었다.
# def downshift(x,y,data):
# if x<n and y<n:
# temp1 = data[x][y]
# data[x][y] = data[x+1][y]
# data[x+1][y] = temp1
# def rightshift(x,y,data):
# if x<n and y<n:
# temp1 = data[x][y]
# data[x][y] = data[x][y+1]
# data[x][y+1] = temp1
반응형