세상을 더 좋게

[백준] 3085 '사탕 게임' 파이썬(python) 본문

Algorithm/브루트 포스

[백준] 3085 '사탕 게임' 파이썬(python)

나는SOU 2022. 1. 14. 00:00

https://www.acmicpc.net/problem/3085

 

3085번: 사탕 게임

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

www.acmicpc.net

import sys
input = sys.stdin.readline

def check(arr):
    n = len(arr)
    answer = 1
    
    for i in range(n):
        # 열 체크
        cnt=1
        for j in range(1, n):
            if arr[i][j] == arr[i][j-1]:
                cnt +=1
            else:
                cnt = 1
            
            if cnt > answer:
                answer = cnt
        # 행 체크        
        cnt = 1
        for j in range(1, n):
            if arr[j][i] == arr[j-1][i]:
                cnt +=1
            else:
                cnt = 1
            
            if cnt > answer:
                answer = cnt
                
    return answer

n = int(input())
arr = [list(input()) for _ in range(n)]
answer = 0

for i in range(n):
    for j in range(n):
        # 열 바꾸기
        if j+1 < n:
            arr[i][j], arr[i][j+1] = arr[i][j+1], arr[i][j]
            
            temp = check(arr)
            
            if temp > answer:
                answer = temp
                
            arr[i][j], arr[i][j+1] = arr[i][j+1], arr[i][j]
            
        # 행 바꾸기
        if i+1 < n:
            arr[i][j], arr[i+1][j] = arr[i+1][j], arr[i][j]
            
            temp = check(arr)
            
            if temp > answer:
                answer = temp
                
            arr[i][j], arr[i+1][j] = arr[i+1][j], arr[i][j]

print(answer)

Point

  • 문제가 다소 복잡하게 보일 수도 있지만 간단하다. 위아래 혹은 좌우로 사탕을 바꿔서 일직선이 가장 길게 나오는 것의 숫자를 찾는 것이다.(애니팡 같은 느낌)
  • 이는 어찌되었든 하나하나 일일이 찾는 것밖에 없기 때문에 for문을 그냥 일방적으로 돌리는 브루트 포스를 사용한다.
  • check라는 함수를 만들고, 해당 함수는 줄을 읽어 최대 몇개가 연속되어 있는지 체크하는 역할을 한다. 한 마디로 우리의 눈 역할
  • 이제 for문을 이용하여 행을 하나하나 바꿔서 check 함수를 적용하고, 또 열을 하나하나 바꿔서 check 함수를 적용한다. 
  • 이중 가장 많이 연속된 사탕이 있으면 그 것을 answer라는 변수에 담고 마지막에 이것을 출력한다.
  • 아직까지 2차원 list를 읽고 그것을 활용하는 것에 있어서 처음에는 낯설고 버벅거리게 된다. 하지만 하나하나 이해하는 것이 아닌 전체적인 윤곽으로서 확인해보고, 자꾸 보다보니 점점 익숙해져가고 있다.