일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준 15787번
- 백준 1987
- java_programming
- 백준 16918번
- 백준 1253번
- ubuntu
- 깃헙
- AWS
- Python
- HUFS 모각코 캠프
- 백준 17451번
- javascript
- 그리디
- 알고리즘
- MySQL
- 그래프
- 다이나믹프로그래밍
- react
- 백준 3085번
- 백준 18310번
- 자바
- SWEA 15612번
- 백준 1331번
- 머신러닝과 딥러닝
- 모각코
- SQL
- 명품자바
- 백준 2512번
- 백준
- 다이나믹 프로그래밍
Archives
- Today
- Total
차곡차곡
[BOJ/Python] 백준 3085번 - 사탕 게임 본문
백준 #3085 사탕 게임
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)
완전 주먹구구식 방법 ,,,
- color 변수에 검사할 알파벳을 담아둔다.
- 같은 라인 앞에서부터 검사하여 알파벳이 같을 경우 카운트 업을 시켜준다.
- 알파벳이 다를 경우 상하좌우에 같은 알파벳이 있는지 검사한다. 이때 검사하는 방향으로 이전 알파벳은 검사하지 않는다. ( → 이렇게 이동하고 있었으면 왼쪽 알파벳은 검사하지 않는 것)
- 바꿀 수 있는 알파벳이 있으면 카운트 업을 시켜주고 알파벳이 변경됐다는 것을 표시한다. (change = True)
- 연속하는 같은 알파벳을 다 세면 해당 카운트를 return 해서 기존 카운트와 비교하여 더 큰 값을 저장한다.
- 이러한 연산을 행 →, 행 ←, 열 ↓, 열 ↑ 버전으로 모두 진행한다.
'CS > Algorithm' 카테고리의 다른 글
[BOJ/Python] 백준 2468번 - 안정 영역 (1) | 2022.09.20 |
---|---|
[BOJ/Python] 백준 18310번 - 안테나 (0) | 2022.09.19 |
[BOJ/Python] 백준 2644번 - 촌수계산 (0) | 2022.09.18 |
[BOJ/Python] 백준 15486번 - 퇴사2 (0) | 2022.09.07 |
[BOJ/Python] 백준 11060번 - 점프 점프 (0) | 2022.09.01 |
Comments