차곡차곡

[BOJ/Python] 백준 3085번 - 사탕 게임 본문

CS/Algorithm

[BOJ/Python] 백준 3085번 - 사탕 게임

sohy 2022. 9. 18. 23:44

백준 #3085 사탕 게임

 

3085번: 사탕 게임

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

www.acmicpc.net

import sys
input = sys.stdin.readline

n = int(input())   # 보드 크기
candy = [list(input().strip()) for _ in range(n)]

def cal_row(i, j):
  color = candy[i][j]
  cnt = 1
  change = False
  for k in range(j+1, n):
    if color == candy[i][k]:
      cnt += 1
    else:
      if not change:
        if 0 <= i + 1 < n and color == candy[i+1][k]:   # 아래쪽 교환
          change = True
          cnt += 1
        elif 0 <= i - 1 < n and color == candy[i-1][k]:   # 위쪽 교환
          change = True
          cnt += 1
        elif 0 <= k + 1 < n  and color == candy[i][k+1]:   # 오른쪽 교환
          cnt += 1
          return cnt
        else:
          return cnt
      else:
        return cnt
  return cnt 

def cal_row_back(i, j):
  color = candy[i][j]
  cnt = 1
  change = False
  for k in range(j-1, -1, -1):
    if color == candy[i][k]:
      cnt += 1
    else:
      if not change:
        if 0 <= i + 1 < n and color == candy[i+1][k]:   # 아래쪽 교환
          change = True
          cnt += 1
        elif 0 <= i - 1 < n and color == candy[i-1][k]:   # 위쪽 교환
          change = True
          cnt += 1
        elif 0 <= k - 1 < n  and color == candy[i][k-1]:   # 왼쪽 교환
          cnt += 1
          return cnt
        else:
          return cnt
      else:
        return cnt
  return cnt 

def cal_col(i, j):
  color = candy[i][j]
  cnt = 1
  change = False
  for k in range(i+1, n):
    if color == candy[k][j]:
      cnt += 1
    else:
      if not change:
        if 0 <= j + 1 < n  and color == candy[k][j+1]:   # 오른쪽 교환
          change = True
          cnt += 1
        elif 0 <= j - 1 < n  and color == candy[k][j-1]:   # 왼쪽 교환
          change = True
          cnt += 1
        elif 0 <= k + 1 < n and color == candy[k+1][j]:   # 아래쪽 교환
          cnt += 1
          return cnt
        else:
          return cnt
      else:
        return cnt
  return cnt

def cal_col_back(i, j):
  color = candy[i][j]
  cnt = 1
  change = False
  for k in range(i-1, -1, -1):
    if color == candy[k][j]:
      cnt += 1
    else:
      if not change:
        if 0 <= j + 1 < n  and color == candy[k][j+1]:   # 오른쪽 교환
          change = True
          cnt += 1
        elif 0 <= j - 1 < n  and color == candy[k][j-1]:   # 왼쪽 교환
          change = True
          cnt += 1
        elif 0 <= k - 1 < n and color == candy[k-1][j]:   # 위쪽 교환
          cnt += 1
          return cnt
        else:
          return cnt
      else:
        return cnt
  return cnt

max_cnt = 0
for i in range(n):
  for j in range(n):
    max_cnt = max(max_cnt, cal_row(i, j))
    max_cnt = max(max_cnt, cal_col(i, j))
    if max_cnt == n:
      print(max_cnt)
      exit(0)

for i in range(n-1, -1, -1):
  for j in range(n-1, -1, -1):
    max_cnt = max(max_cnt, cal_row_back(i, j))
    max_cnt = max(max_cnt, cal_col_back(i, j))
    if max_cnt == n:
      print(max_cnt)
      exit(0)

print(max_cnt)

완전 주먹구구식 방법 ,,,

  1. color 변수에 검사할 알파벳을 담아둔다.
  2. 같은 라인 앞에서부터 검사하여 알파벳이 같을 경우 카운트 업을 시켜준다.
  3. 알파벳이 다를 경우 상하좌우에 같은 알파벳이 있는지 검사한다. 이때 검사하는 방향으로 이전 알파벳은 검사하지 않는다. ( → 이렇게 이동하고 있었으면 왼쪽 알파벳은 검사하지 않는 것)
  4. 바꿀 수 있는 알파벳이 있으면 카운트 업을 시켜주고 알파벳이 변경됐다는 것을 표시한다. (change = True)
  5. 연속하는 같은 알파벳을 다 세면 해당 카운트를 return 해서 기존 카운트와 비교하여 더 큰 값을 저장한다.
  6. 이러한 연산을 행 →, 행 ←, 열 ↓, 열 ↑ 버전으로 모두 진행한다.

Comments