본문 바로가기
백준/정렬, 탐색

[백준🥈3] #3085 사탕게임 (python)

by 똥먹는낙타 2022. 8. 2.
728x90
반응형

3085번: 사탕 게임 (acmicpc.net)

 

3085번: 사탕 게임

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.

www.acmicpc.net

문제

상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다.

가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.

사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)

다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.

사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.

출력

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.

예제 입력 1

3
CCP
CCP
PPC

예제 출력 1

3

예제 입력 2

4
PPPP
CYZY
CCPY
PPCC

예제 출력 2

4

 

✔️ Code

def check(data):
    max_cnt = 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_cnt = max(max_cnt, cnt)

        cnt = 1
        for j in range(1, N):
            if data[j][i] == data[j-1][i]:
                cnt += 1
            else:
                cnt = 1
            max_cnt = max(max_cnt, cnt)
    
    return max_cnt

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]
            cnt = check(data)
            ans = max(ans, cnt)
            # 바꾼 것 원래대로 돌려놓기
            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]
            cnt = check(data)
            ans = max(ans, cnt)
            # 바꾼 것 원래대로 돌려놓기
            data[i][j], data[i+1][j] = data[i+1][j], data[i][j]

print(ans)

 

✏️ Comment

처음에 인접한 사탕을 검사하기 위해서 상하좌우를 검사해야겠다고 생각했는데, 어떻게 구현해나가야 할지 몰라서 다른 풀이를 참고했다.
알고보니 그냥 인접한 것끼리 하나하나 다 자리를 바꿔주면서 일치하는 사탕들의 max 갯수를 구해나가는 방식으로 풀면 되는 거였다.
그리고 중요한 것은 위에서부터 순차적으로 검사한다고 치면 굳이 왼쪽, 위쪽에 있는 사탕을 검사할 필요가 없다.
따라서 오른쪽과 아래에 있는 사탕만 검사하면 된다.

아직 구현 하는 능력이 많이 부족한 것 같다... 구현 부분 문제를 많이 연습해봐야겠다.

728x90
반응형

댓글