https://www.acmicpc.net/problem/3085
문제 이해
- NxN의 크기에 사탕을 채우지만 사탕의 색상은 모두 동일하지 않을 수 있습니다.
- 상근이는 과자의 색이 다른 인접한 두 개의 송어를 선택하고 선택한 송어에 들어있는 과자를 교환합니다.
- 모두 같은 색으로 구성된 가장 긴 연속 부분 (행 또는 열)을 선택하고 그 사탕을 먹는다.
- 상근을 먹을 수 있는 캔디의 최대수를 요구하는 프로그램을 작성하자.
문제 해결
- 사탕은 한 번만 교환할 수 있는 것 같다.
=> 문제에 추가할 조건 - 위, 아래, 왼쪽, 오른쪽을 모두 조사하고 색이 다른 사탕이 존재한다면 교환하자.
- 교체하고 입력된 사탕 열과 행에 있는 연속 사탕 수를 확인합니다.
- 연속 사탕 수 검사는 주어진 사탕 색으로 문자열을 생성하고이 값이 매개 변수로 전달 된 문자열에 존재하는지 확인하도록 진행되었습니다.
풀 코드
n=int(input())
candy=(list(input()) for _ in range(n))
ans=1
def check(check_str):
global ans
global n
alpha=('C', 'P', 'Z', 'Y')
for a in alpha:
for num in range(1, n+1):
if num>ans and a*num in check_str:
ans=max(num, ans)
def solution(candy, px, py, n):
dx=(1, 0)
dy=(0, 1)
for x, y in zip(dx, dy):
nx=px+x
ny=py+y
if 0<=nx<n and 0<=ny<n and candy(px)(py)!
=candy(nx)(ny):
candy(px)(py), candy(nx)(ny)=candy(nx)(ny), candy(px)(py)
for i in range(n):
check(''.join(candy(i)))
check(''.join(c(i) for c in candy))
candy(px)(py), candy(nx)(ny)=candy(nx)(ny), candy(px)(py)
# 교체하지 않았을 때의 체크
for i in range(n):
check(''.join(candy(i)))
check(''.join((c(i) for c in candy)))
for i in range(n):
for j in range(n):
solution(candy, i, j, n)
print(ans)
처음에는 교환한 행이나 열에 대해서만 체크를 했지만, 이 경우는 80%로 잘못되었습니다.
내가 생각할 때 한 번 교환하는 것이 하나의 경우이므로 위의 경우가 반례처럼 보입니다.