작성
·
63
0
안녕하세요 선생님, 수업 잘 듣고있습니다 ㅎㅎ
다름이 아니라, 섹션 3의 5.수들의 합 문제에서 궁금한 점이 있습니다
import sys
sys.stdin = open("input.txt", 'r')
n, m=map(int, input().split())
a=list(map(int, input().split()))
lt=0
rt=1
tot=a[0]
cnt=0
while True:
if tot<m:
if rt<n:
tot+=a[rt]
rt+=1
else:
break
elif tot==m:
cnt+=1
tot-=a[lt]
lt+=1
else:
tot-=a[lt]
lt+=1
print(cnt)
이 코드에서, 여기서 만약 rt가 맨끝까지 가서 n에갔지만 / lt는 n 이전까지도 못왔다면(예를 들면 lt는 3인데 rt는 n인 경우) 이건 논리에 어긋나지 않나 궁금해서 질문드렷습니다.
항상 좋은강의 감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
성공하자님의 질문은 ‘수들의 합’ 문제에서 lt
와 rt
포인터의 동작 방식과 논리적 일관성에 대한 질문으로 이해됩니다. 이 문제는 특정 조건을 만족하는 부분 배열의 개수를 찾는 문제로, 투 포인터 방식을 이용하여 해결할 수 있습니다. 여러분이 질문하신 내용은 lt
가 rt
보다 항상 작거나 같아야 하는 이유와, rt
가 배열의 끝에 도달했을 때 lt
의 처리 방법에 대한 궁금증으로 보여집니다.
먼저, 유사한 문제 해결 방법을 제시하는 기존의 답변을 여기 상세하게 설명하겠습니다.
비슷한 while 문 코드 질문입니다! 게시글에서 질문자는 ‘수들의 합’에 대한 코드를 공유하고, 예상치 못한 결과에 대해 문의하였습니다. 이 문제의 주된 관심사는 lt
와 rt
인덱스의 움직임을 통해 목표 합(m
)을 찾는 것입니다. 문제 해결의 핵심은 lt
와 rt
를 적절히 이동시키며 부분 배열의 합을 조건에 맞게 탐색하는 것입니다.
문제에 대한 답변에서는, rt
인덱스가 배열의 끝에 도달한 경우에도 lt
인덱스를 이용하여 남은 부분 배열을 계속 검사해야 한다는 점을 강조합니다. 즉, rt
가 배열의 끝에 도달해도 lt
를 이동시키며 조건을 만족하는지 계속 확인해야 합니다. 이 과정에서 부분 배열의 합이 목표 합 m
과 같은 경우 카운트를 증가시키고, lt
를 증가시켜 다음 가능성 있는 부분 배열을 찾습니다.
교훈은, lt
와 rt
포인터 사용의 논리는 배열 내에서 가능한 모든 부분 배열을 효율적으로 검사하여, 주어진 조건(예: 합이 m
과 같은)을 만족하는 부분 배열을 찾는 데 있습니다. 따라서 lt
가 rt
보다 작거나 같은 위치에 있을 때까지 부분 배열을 계속 검사해야 하며, 이는 논리적으로 어긋나지 않습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.