반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 가상메모리 관리
- 코딩테스트
- 가상메모리
- programmers
- BFS
- DP
- 그리디
- 에라스토테네스의 체
- 브루트포스
- level0
- BOJ
- level2
- 프로그래머스
- 다익스트라
- MYSQL
- 힙
- 다이나믹 프로그래밍
- 운영체제
- 파이썬
- 딕셔너리
- 백준
- 구현
- N과M
- level1
- level3
- 스택
- 재귀
- dfs
- 수학
- python
Archives
- Today
- Total
동캄의 코딩도장
백준 30804 [과일탕후루] 파이썬 본문
반응형
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 |