하나씩 알아가기

[BOJ_3085] 사탕 게임 본문

알고리즘

[BOJ_3085] 사탕 게임

clearwater 2021. 1. 24. 23:54
728x90
반응형

인접한 두 사탕을 교환하여 그 때마다 사탕 길이를 계산하고 가장 긴 사탕 길이를 출력하면 해결할 수 있는 문제입니다.

 

양옆에 인접한 사탕을 스왑하고

가로 길이 확인 -> 갱신

세로 길이 확인 -> 갱신

스왑한 사탕을 되돌려 놓음

위아래로 인접한 사탕을 스왑하고

가로 길이 확인 -> 갱신

세로 길이 확인 -> 갱신

 

빨간 글씨로 쓴 부분은 반복되기 때문에 함수로 빼 주었습니다.

길이를 계산해 주는 함수에서 중요한 것은 내부 루프입니다.

index가 범위를 벗어나지 않도록 0 ~ n-1(n-1미포함)까지 설정 해주고

인접한 두 사탕이 같은 사탕이면 count를 증가시켜 주고

다른 사탕이면 길이를 갱신하고 다음번 비교를 위해 count를 1로 초기화 시킵니다

 

파이썬의 함수 내부에 global 키워드를 사용하면 전역변수를 사용하겠다고 선언하게 되며

변수를 수정할 수 있게 됩니다(물론 남용하면 좋지 않습니다).

 

n = int(input())
candy = []

for _ in range(n):
    candy.append([char for char in input()])

# 계산하는 로직
def candyLength():
    global result
    # 양 옆 계산
    for i in range(n):
        count = 1
        for j in range(n-1):
            if candy[i][j] == candy[i][j + 1]:
                count += 1
            else:
                result = max(result, count)
                count = 1
        result = max(result, count)
    # 위 아래 계산
    for i in range(n):
        count = 1
        for j in range(n-1):
            if candy[j + 1][i] == candy[j][i]:
                count += 1
            else:
                result = max(result, count)
                count = 1
        result = max(result, count)
    return result

result = 0
for i in range(n):
	for j in range(n-1):
		candy[i][j], candy[i][j + 1] = candy[i][j + 1], candy[i][j]
		result = candyLength()
		candy[i][j], candy[i][j + 1] = candy[i][j + 1], candy[i][j]

		candy[j][i], candy[j + 1][i] = candy[j + 1][i], candy[j][i]
		result = candyLength()
		candy[j][i], candy[j + 1][i] = candy[j + 1][i], candy[j][i]
print(result)

 

www.acmicpc.net/problem/3085

 

3085번: 사탕 게임

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.

www.acmicpc.net

 

728x90
반응형

'알고리즘' 카테고리의 다른 글

DFS와 BFS 파이썬 코드  (0) 2021.01.27
[BOJ_2193] 이친수  (0) 2021.01.25
[BOJ_1476] 날짜 계산  (0) 2021.01.24
[BOJ_2309] 일곱 난쟁이  (0) 2021.01.24
[BOJ_15990] 1, 2, 3 더하기 5  (0) 2021.01.23