일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- DFS
- DP
- 오라클
- 문자열
- 백트래킹
- 데이터베이스
- 프로그래머스
- 다이나믹 프로그래밍
- 그리디 알고리즘
- oracle
- SW Expert Academy
- 자바스크립트
- 백준 알고리즘
- 스택
- 너비우선탐색
- javascript
- 깊이우선탐색
- Python
- 다익스트라
- 완전탐색
- 브루트포스 알고리즘
- 브루트포스
- 그래프 탐색
- 백준알고리즘
- 파이썬
- 너비 우선 탐색
- 구현
- 그래프 이론
- SWEA
- BFS
- Today
- Total
민규의 흔적
[Python 파이썬] 백준 3085번 - 사탕 게임 본문
상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다.
가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.
사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)
다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.
사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.
출력
첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.
알고리즘 분류
- 구현
- 브루트포스 알고리즘
문제 접근
우리가 해야하는 작업은 다음과 같다.
1. 각 행의 인접한 열을 서로 바꾸고 모든 보드의 요소들에 대해 연속되는 사탕이 최대 몇 개인지 파악하기
2. 각 열의 인접한 행을 서로 바꾸고 모든 보드 의 요소들에 대해 연속되는 사탕이 최대 몇 개인지 파악하기
안타깝지만 정말 무식하게 해야한다. 단순 구현 문제이니 만큼 문제가 어떤걸 요구하고 있고 어떤 작업을 순차적으로 진행해야 하는지 분석하고 코드를 작성해야 한다.
# 1. 각 행의 인접한 열을 서로 바꾸기
for row in range(N):
for col in range(N - 1):
board[row][col], board[row][col + 1] = board[row][col + 1], board[row][col]
# 모든 보드의 요소를 순회하며 연속되는 사탕이 최대 몇 개인지 파악하기
findMaxCandy()
# 보드 원상태로 되돌리기
board[row][col], board[row][col + 1] = board[row][col + 1], board[row][col]
# 2. 각 열의 인접한 행을 서로 바꾸기
for col in range(N):
for row in range(N - 1):
board[row][col], board[row + 1][col] = board[row + 1][col], board[row][col]
# 모든 보드의 요소를 순회하며 연속되는 사탕이 최대 몇 개인지 파악하기
findMaxCandy()
# 모드 원상태로 되돌리기
board[row][col], board[row + 1][col] = board[row + 1][col], board[row][col]
위 두 작업은 보드를 다시 되돌리는 작업이 무조건 추가로 진행되어야 한다.
매 경우 인접한 행 혹은 열을 한 번만 스왑해준다는 조건이기 때문이다.
# 보드를 순회하며 연속되는 사탕이 최대 몇 개인지 파악하기
def findMaxCandy():
global maxCnt
# 행 탐색
for row in range(N):
nowCnt = 0
nowColor = ""
for col in range(N):
if nowColor != board[row][col]:
maxCnt = max(maxCnt, nowCnt)
nowCnt = 1
nowColor = board[row][col]
else:
nowCnt += 1
maxCnt = max(maxCnt, nowCnt)
# 열 탐색
for col in range(N):
nowCnt = 0
nowColor = ""
for row in range(N):
if nowColor != board[row][col]:
maxCnt = max(maxCnt, nowCnt)
nowCnt = 1
nowColor = board[row][col]
else:
nowCnt += 1
maxCnt = max(maxCnt, nowCnt)
스왑이 진행된 보드에 대해 각 행에서 연속되는 사탕의 개수와, 각 열에서 연속되는 사탕의 개수를 계속 비교한다.
연속된다의 기준은 이전 색을 담고 있는 nowColor와 현재 탐색하는 보드의 요소가 같은 색일 때를 의미한다.
입력 예제
3
CCP
CCP
PPC
출력 예제
3
전체 코드
# 3085
def findMaxCandy():
global maxCnt
# 행 탐색
for row in range(N):
nowCnt = 0
nowColor = ""
for col in range(N):
if nowColor != board[row][col]:
maxCnt = max(maxCnt, nowCnt)
nowCnt = 1
nowColor = board[row][col]
else:
nowCnt += 1
maxCnt = max(maxCnt, nowCnt)
# 열 탐색
for col in range(N):
nowCnt = 0
nowColor = ""
for row in range(N):
if nowColor != board[row][col]:
maxCnt = max(maxCnt, nowCnt)
nowCnt = 1
nowColor = board[row][col]
else:
nowCnt += 1
maxCnt = max(maxCnt, nowCnt)
if __name__ == "__main__":
N = int(input())
board = []
for _ in range(N):
board.append(list(input()))
maxCnt = 0
findMaxCandy()
for row in range(N):
for col in range(N - 1):
board[row][col], board[row][col + 1] = board[row][col + 1], board[row][col]
findMaxCandy()
board[row][col], board[row][col + 1] = board[row][col + 1], board[row][col]
for col in range(N):
for row in range(N - 1):
board[row][col], board[row + 1][col] = board[row + 1][col], board[row][col]
findMaxCandy()
board[row][col], board[row + 1][col] = board[row + 1][col], board[row][col]
print(maxCnt)
풀이 후기
단순 구현 문제는 문제가 요구하는 바를 명확히 이해하고 순서도를 생각한 후, 코드를 작성하는 것이 문제를 빠르게 풀 수 있는 방법 중 하나라고 생각한다.
'BOJ' 카테고리의 다른 글
[Python 파이썬] 백준 10971번 - 외판원 순회 2 (2) | 2024.07.15 |
---|---|
[Python 파이썬] 백준 14888번 - 연산자 끼워넣기 (2) | 2024.07.15 |
[Python 파이썬] 백준 1182번 - 부분수열의 합 (0) | 2024.07.12 |
[Python 파이썬] 백준 14889번 - 스타트와 링크 (0) | 2024.07.10 |
[JavaScript 자바스크립트], [Python 파이썬] 백준 2606번 - 바이러스 (0) | 2024.07.08 |