코딩테스트/Lv1
[Python] 백준 온라인 저지 3085번
ggulgood
2022. 4. 27. 03:03
실버 4 https://www.acmicpc.net/problem/3085
3085번: 사탕 게임
예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.
www.acmicpc.net
상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다.
가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다.
그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.
사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.
힌트: 예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.
[Python]
풀이 방법:
다 해보면 되는 문제, 브루트포스 예제이다.
테이블 크기가 50보다 작기 때문에 시간복잡도가 O(N^4)이지만 시간초과가 나지 않는다.
인접한 두 칸을 고르고 사탕을 교환하는 방법은 상하좌우로 4가지가 있다
그러나 테이블을 순차적으로 검사했을때 위로 바꾸는 방법과, 왼쪽으로 바꾸는 방법은 이전에 검사했었으므로 다시 고려할 필요가 없다.
따라서 밑으로 바꾸는 방법과 오른쪽으로 바꾸는 방법 두 가지만 고려하면 된다.
코드:
import time
import sys
sys.stdin = open("input.txt", "r")
# input = sys.stdin.readline
start_time = time.time()
# source code
def check(arr): # 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
cnt += 1
else: # 다르다면 1로 초기화
cnt = 1
if cnt > answer: # 비교해서 현재 cnt가 더 크다면 answer 갱신
answer = cnt
# 이제 행 차례. 행 순회하면서 연속 숫자 세기
cnt = 1
for j in range(1, n):
if arr[j][i] == arr[j-1][i]: # 이전 것과 같다면 cnt + 1
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)
# 바꿨던 것을 다시 원래대로 돌려놓기
arr[i][j], arr[i+1][j] = arr[i+1][j], arr[i][j]
print(answer)
#
end_time = time.time()
print("WorkingTime: {} sec".format(end_time-start_time))
추가 예정 - [Javascript]
풀이 방법:
정답: