[백준] 3085번(사탕 게임)

·2023년 6월 21일

백준 문제풀이

목록 보기
92/159

백준 3085번


최종 제출 코드

1) 입력값 받기

n = int(input())
array = [0 for i in range(n)]

for i in range(n):
  array[i] = list(input())

.

2) 같은 열에서 원소를 교환했을 때의 최대 길이를 구하는 함수

  • (i, j)를 매개변수로 받은 경우 array[i][j]array[i][j+1]을 교환하고, 이 경우 같은 색이 연속되는 최대 길이를 구한다.
  • 인접한 열끼리 원소를 교환하는 경우 영향을 미치는 범위는 i행j열, j+1열이다.
    ⇒ 매번 전체 배열에 대해 최대값을 구할 필요 없이 변경 범위 내에서만 최대값을 검사
# 같은 열내에서 인접한 원소 교환
def change_column(row, col):
  tmp = array[row][col]
  array[row][col] = array[row][col+1]
  array[row][col+1] = tmp

  vmax_len = 0
  
  rmax_len = 1
  for j in range(n-1):
    if array[row][j] == array[row][j+1]:
      rmax_len += 1
      if rmax_len > vmax_len:
        vmax_len = rmax_len
    else:
      rmax_len = 1

  for i in range(col, col+2):
    cmax_len = 1
    for j in range(n-1):
      if array[j][i] == array[j+1][i]:
        cmax_len += 1
        if cmax_len > vmax_len:
          vmax_len = cmax_len
      else:
        cmax_len = 1

  tmp = array[row][col]
  array[row][col] = array[row][col+1]
  array[row][col+1] = tmp
  
  return vmax_len

.

3) 같은 행에서 원소를 교환했을 때의 최대 길이를 구하는 함수

  • (i, j)를 매개변수로 받은 경우 array[i][j]array[i+1][j]을 교환하고, 이 경우 같은 색이 연속되는 최대 길이를 구한다.
  • 인접한 행끼리 원소를 교환하는 경우 영향을 미치는 범위는 i행, i+1행j열이다.
# 같은 행내에서 인접한 원소 교환
def change_row(row, col):
  tmp = array[row][col]
  array[row][col] = array[row+1][col]
  array[row+1][col] = tmp

  vmax_len = 0
  
  cmax_len = 1
  for j in range(n-1):
    if array[j][col] == array[j+1][col]:
      cmax_len += 1
      if cmax_len > vmax_len:
        vmax_len = cmax_len
    else:
      cmax_len = 1

  for i in range(row,row+2):
    rmax_len = 1
    for j in range(n-1):
      if array[i][j] == array[i][j+1]:
        rmax_len += 1
        if rmax_len > vmax_len:
          vmax_len = rmax_len
      else:
        rmax_len = 1

  tmp = array[row][col]
  array[row][col] = array[row+1][col]
  array[row+1][col] = tmp
  
  return vmax_len

.

4) 위에서 작성한 함수를 이용하여 결과값을 구한다.

result = 0
for i in range(n-1):
  for j in range(n):
    result = max(result, change_row(i, j))

for i in range(n):
  for j in range(n-1):
    result = max(result, change_column(i, j))

print(result)
profile
백엔드 개발자가 되고 싶어요(22.8.15~)

0개의 댓글