deque 방식과 lt / rt while 문 방식의 차이
안녕하세요?
강사님께서 영상에서는 deque 자료형으로 바로바로 pop 하는 방식으로 코드를 짜셨는데요
강의 내용:
arr.sort()
arr = deque(arr)
cnt = 0
while arr:
if len(arr)==1:
cnt += 1
break
if arr[0]+arr[-1] > limit:
arr.pop()
cnt += 1
else:
arr.popleft()
arr.pop()
cnt += 1
print(cnt)
그런데 비슷하다고 생각한 인덱스 이동 방식은 오답인 거 같습니다
arr.sort()
lt = 0
rt = n - 1
while lt <= rt:
if len(arr) == 1:
cnt += 1
break
sum = arr[lt] + arr[rt]
if sum <= limit:
cnt += 1
lt += 1
rt -= 1
else:
cnt += 1
rt -= 1 # 맨 끝 가장 큰 수 pop
print(cnt)
테스트 케이스는
강사님께서 댓글에 알려주신
8 149
71 72 73 74 75 76 77 78 149
로 돌려보니, 강의 내용은 5가 나오고
두번째 방식은 4가 나오네요?
근데 제가 이해가 딸려서 그런지 인덱스 이동하는 방식과 pop 방식의 차이가 잘 머리로 들어오지 않습니다..
답변 2
0
안녕하세요^^
위에 입력은 4가 정답입니다. 그리고 강의내용의 코드로도 4가 나옵니다.
from collections import deque
p = [71, 72, 73, 74, 75, 76, 77, 78]
limit = 149
n = len(p)
p.sort()
p=deque(p)
cnt=0
while p:
if len(p)==1:
cnt+=1
break
if p[0]+p[-1]>limit:
p.pop()
cnt+=1
else:
p.popleft()
p.pop()
cnt+=1
print(cnt)그리고 아래 인프런 인턴이 말한 lt, rt를 쓸경우 len(arr)의 값이 처음값 그대로이니 if break 문은 제거해도 됩니다.
arr = [71, 72, 73, 74, 75, 76, 77, 78]
limit = 149
n = len(arr)
arr.sort()
lt = 0
rt = n - 1
cnt = 0
while lt <= rt:
sum = arr[lt] + arr[rt]
if sum <= limit:
cnt += 1
lt += 1
rt -= 1
else:
cnt += 1
rt -= 1 # 맨 끝 가장 큰 수 pop
print(cnt)
0
안녕하세요, 인프런 AI 인턴입니다.
질문해주신 deque 방식과 인덱스 이동 방식의 차이에 대해 설명드리겠습니다.
먼저 deque 방식에서는 popleft()와 pop()을 통해 실제로 배열의 요소를 맨 앞이나 맨 뒤에서 제거합니다. 이는 덱(deque) 자료구조의 특성을 활용한 것으로, 양쪽 끝에서의 추가 및 삭제 작업이 아주 빠르게 이루어집니다. 따라서 배열의 크기가 실시간으로 줄어들면서 len(arr) 값이 바로바로 반영됩니다.
반면, 인덱스 이동 방식에서는 배열의 크기 자체를 변화시키지 않고, 두 개의 인덱스 포인터 lt와 rt를 이동시키면서 조건에 따른 연산만을 수행합니다. 이 방식으로 배열의 양 끝에서 조건을 확인하나 물리적으로 배열의 크기를 변경하지 않으므로, 배열의 길이를 따로 관리하거나 확인할 필요가 없습니다.
문제가 되는 부분은 두 번째 코드의 while 문 내 조건에서 lt <= rt인 경우에 대한 처리입니다. 두번째 방식에서는 if len(arr) == 1: 조건이 실제로는 의미가 없으며, 이것이 while lt <= rt:와 겹쳐져서 실제로 오답을 유발할 수 있습니다.
또한, 두 방식의 차이점 중 하나는 두번째 방식에서 cnt += 1이라는 연산이 if 문과 else 문 양쪽에 중복되어 작성되어 있는 점입니다. if 문과 else 문의 공통된 처리를 반복문의 끝에서 단 한 번만 처리하면 더 효율적입니다.
정확한 문제 파악을 위해서는 사용하신 테스트 케이스와 limit 값, 그리고 n의 정의가 필요합니다만, 주어진 코드를 보면 알고리즘 로직의 오류로 보입니다. 위와 같은 두 가지 방식 모두 의도하는 문제 해결에 대한 접근이 올바르지만, 구현 세부사항에서의 차이로 인해 오류가 발생한 것 같습니다.
더 구체적인 해결 방법을 알아보시려면 작성하신 코드의 전체적인 맥락과, 사용하신 변수들에 대한 정의를 다시 한번 확인하시는 것을 추천드립니다.
기존에 윈도우 10으로 잘 써왔는데 윈도우 11로 바꾸고 나서 채점이 안됩니다.
1
78
2
스택에서 ')'을 만나는 경우
0
79
3
문제가 어디있나요?
0
67
2
변수 or 함수명
0
61
1
침몰하는 타이타닉 문제 질문입니다
0
58
1
AA.py 책점 에러
0
60
1
오늘 구매했는데 파이썬 자료구조 궁금한거 있으면 답변이 잘 될까요.
0
111
2
5.동전분배하기 문제 밑에코드도 정답이될까요?
0
110
1
아나그램 비교 코드
0
116
2
AA.PY파일 복사 후 채점 진행할때 오류 발생합니다.
0
161
2
문제 링크가있나여?
0
147
2
채점기 Time Limit Exceeded 오류 문의
1
165
2
동적계획법은 사용하는 문제
0
126
2
제 코드 좀 봐주세요
0
148
1
예외가 존재할 가능성?
0
97
1
3번이 안풀립니다
0
93
0
5번 틀림
0
115
0
오류원인?
0
98
0
리스트 선언
0
107
1
침몰하는 타이타닉(그리디) 문제 질문
0
110
1
알고리즘
0
69
1
코딩테스트
0
92
1
DFS 순서 질문드립니다.
0
129
2
left, right를 사용한 풀이법에 대한 질문입니다
0
91
1





