동캄의 코딩도장

백준 30804 [과일탕후루] 파이썬 본문

코테/BOJ

백준 30804 [과일탕후루] 파이썬

동 캄 2025. 2. 3. 16:49
반응형

https://www.acmicpc.net/problem/30804

 

 

투포인터를 적용하는 문제다.

 

처음에 잘못 풀었다. 

'''# 백준 30804 과일 탕후루
import sys
N=int(sys.stdin.readline())
fruits=list(map(int,sys.stdin.readline().rstrip().split()))
ans=0
i=0
new_start_ind=0

if N==1:
    print(1)
else:
    while i<N-1:
        start_fruit= fruits[i]
        temp_fruit=fruits[i]
        temp=0
        for j in range(i,N):            
            if start_fruit == temp_fruit:
                if temp_fruit != fruits[j]:
                    new_start_ind=j
                    temp_fruit=fruits[j]
                if j==N-1:
                    new_start_ind=j
                temp+=1
            else:
                if start_fruit == fruits[j]:
                    temp+=1
                elif temp_fruit != fruits[j]:
                    break
                else:
                    temp+=1
        ans=max(ans,temp)
        i=new_start_ind
    print(ans)

얘를들어

10

3 1 2 2 1 1 1 1 1 1 과 같은 입력이 있다고하면

3 1

1 2 2 1 1 1 1 1 1 이렇게 두번만 연산하면 되지만

위의 케이스는

3 1

1 2 2

2 2 1 1 1 1 1 1

1 1 1 1 1 1 로 연산을 더 많이한다. 

 

따라서 위의 케이스를 고려해주면

#백준 30804 과일탕후루
import sys

# 과일 개수 입력
N = int(sys.stdin.readline())

# 과일 배열 입력
fruits = list(map(int, sys.stdin.readline().rstrip().split()))

# 최대 연속 부분 수열 길이
ans = 1  
i = 0  # 현재 탐색 시작 인덱스
new_start_ind = 0  # 새로운 탐색 시작 위치
temp_ind = 0  # 현재 탐색 중의 인덱스 (사용되지 않음)

while True:
    start_fruit = fruits[i]  # 첫 번째 과일
    temp_fruit = fruits[i]  # 두 번째 과일 후보
    temp = 0  # 현재 연속된 과일 개수

    # 마지막 과일까지 탐색이 끝나면 종료
    if i == N - 1:
        break

    # 현재 위치 i부터 끝까지 탐색
    for j in range(i, N):
        if start_fruit != temp_fruit:  
            # 새로운 과일이 기존 두 개 중 하나와 일치하면 추가
            if temp_fruit == fruits[j]:
                temp += 1           

            # 새로운 과일이 기존 과일 둘과 다르다면, 과일 하나를 변경
            elif start_fruit == fruits[j]:  
                start_fruit = temp_fruit  # start_fruit을 변경
                temp_fruit = fruits[j]  # temp_fruit을 새 과일로 변경
                new_start_ind = j  # 새로운 탐색 시작 위치 저장
                temp += 1  

            # 새로운 과일이 기존 두 개와 모두 다르면 중단
            else:
                break
        else:
            # 연속된 같은 과일이 끝나면 새로운 과일로 설정
            if temp_fruit != fruits[j]:  
                temp_fruit = fruits[j]   
            new_start_ind = j  # 새로운 시작 위치 갱신
            temp += 1

    # 최대 연속 부분 길이 업데이트
    ans = max(ans, temp)

    # 탐색 시작 위치를 변경 (다음 탐색 위치로 이동)
    i = new_start_ind  

# 결과 출력
print(ans)

해결할 수 있다.

시작할때 과일(start_fruit), 지금 제일 앞 과일(temp_fruit), 현재 내가 보고 있는 과일(fruits[j])를 비교하며 연산을 하게 된다.

반응형

'코테 > BOJ' 카테고리의 다른 글

백준 14940 [쉬운 최단거리] 파이썬  (0) 2025.02.04
백준 1991 [트리순회] 파이썬  (0) 2025.02.04
백준 1484 [다이어트] 파이썬  (0) 2024.01.17
백준 1052 [물병] 파이썬  (0) 2024.01.16
백준 11286 [절댓값 힙] 파이썬  (0) 2023.03.21