-
백준_25916_싫은데요 (python)카테고리 없음 2023. 7. 10. 22:34
★ 접근
데이터가 주어지고 문제 조건 상 데이터를 다시 정렬할 수 없다. 투 포인터를 활용해야 한다는 것을 알 수 있다.
★ 풀이
1. n이 1일 수도 있으니 조건문을 써준다.
2. n이 2 이상이라면 temp에 data[l]을 일단 더하는데 while문 안에 들어가서 r이 작다면 더하면서 앞으로 가면 되고 크다면 바로 l을 빼주면 되기 때문에 아무 조건 없이 data[l]을 더하면 된다. (처음에 필자는 data[l]이 m보다 작으면 더하고 크면 작는 경우가 나올 때까지 l과 r을 증가시키면서 찾았다.)
- 코드
import sys input = sys.stdin.readline n,m = map(int,input().split()) data = list(map(int,input().split())) if n == 1: if data[0] > m: print(0) else: print(data[0]) else: temp = 0 ans = 0 l,r = 0,1 temp += data[l] while l <= r and r < n: if data[r] <= m - temp: # 만약 data[r]보다 크거나 같아 그럼 더할 수 있는거니까 temp += data[r] # 더해 r += 1# 그리고 r만 증가시켜 else: # 근데 만약 data[r]이 더 크면 l을 빼야지 if l == r: # l이 r과 같다는 의미는 현재 idx가 혼자만으로도 너무 크니까 l += 1 #l,r을 하나씩 증가시키고 temp도 0으로 만들어 r += 1 temp = 0 continue temp -= data[l] #temp에서 data[l]을 빼 l += 1 # l을 1증가시 ans = max(ans,temp) print(ans)
★ 회고
처음에 투 포인터인 것을 알았지만 다른 방법으로 풀어보고 싶어서 했다가 바로 틀렸다. 다시 투 포인터로 돌아왔지만 처음에 while 반복문을 들어가기전에 temp에 += data[i] 과정에서 많이 헤맸다. temp에 막 더하면 안 된다고 생각했기 때문에 여러 조건문을 걸었다가 먼 길을 돌아왔다. 결국 정답은 어떠한 조건도 걸지 않은 것이었고 평소였으면 후딱 끝냈을 문제였는데 아쉽다. 집중해서 풀어보자!