인프런 커뮤니티 질문&답변

wannabeing님의 프로필 이미지
wannabeing

작성한 질문수

입문자를 위한 코딩테스트 핵심(이론과 문제풀이) [Python]

[문제 3번] 두 수의 합 : O(nlogn) --- two pointers

두수의합 sorting 질문

작성

·

15

0

강사님

밑에 코드로 작성해도 괜찮은가요!?

잘보고있습니당!!

def solution(nums, target):
    answer = [0]*2
    nums.sort()
    n = len(nums)
    
    left = 0
    right = n-1 
    sumV = nums[left] + nums[right]
    
    for _ in range(n):
        if sumV == target:
            answer = [nums[left], nums[right]]
            break
        elif sumV > target:
            right -= 1
            sumV = nums[left] + nums[right]
        elif sumV < target:
            left += 1
            sumV = nums[left] + nums[right]
          
    return answer

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

두 수의 합 문제를 해결하기 위해 투 포인터 접근 방식을 사용하셨네요. 이 방법은 정렬된 배열을 다루며 시간 복잡도를 O(n)으로 유지할 수 있어 효율적입니다. 주요 포인트를 아래에 정리해 드리겠습니다.

코드 설명

  • 정렬 사용: 처음에 nums.sort()를 통해 배열을 정렬하셨습니다. 이는 O(n log n)의 복잡도를 가지나, 이후 투 포인터 알고리즘을 사용할 수 있도록 준비하는 과정입니다.
  • 투 포인터 방식: leftright라는 포인터를 각각 배열의 시작과 끝에 배치합니다. 현재 포인터들의 합을 sumV로 계산하며, 목표 값인 target과 비교합니다.
  • 조건에 따른 포인터 이동:
    • sumVtarget과 같으면 정답 리스트에 현재 left와 right 포인터 위치의 값을 저장하고 종료합니다.
    • sumVtarget보다 크다면 right 포인터를 왼쪽으로 이동시켜 합을 줄입니다.
    • sumVtarget보다 작다면 left 포인터를 오른쪽으로 이동시켜 합을 키웁니다.

주의사항

  • break 위치: 현재 루프에서 sumV를 재계산하는 위치를 조정하면 루프 바깥에서도 사용할 수 있어 이해가 더 쉬울 수 있습니다.
  • 포인터 초과 주의: left 또는 right 포인터가 배열을 초과하지 않도록 루프 조건을 설정하는 것도 필요합니다.

관련하여 두 수의 합 O(n) 문제에 관한 질문입니다는 다른 방식의 해결법과 비교하며 시간 복잡도에 대한 논의가 이루어진 게시물입니다. 도움이 되실 것이라 생각합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wannabeing님의 프로필 이미지
wannabeing

작성한 질문수

질문하기