[3273] 두수의 합

백준 문제 풀이

3273번: 두 수의 합

  • 해설

      N개의 원소 중 2개를 더했을 때 X 값이 되는 조합의 수를 구하는 문제이다.
        
      일일히 2개를 픽해서 더하는 방식도 가능하겠지만, N이 크기 때문에
      좀 더 효율적인 방식이 좋을 것이다.
        
      그래서 사용하는 것이 투 포인터이다.
        
      투 포인터
      포인터를 2개 둬서 조건에 따라 해당 포인터를 이동시키면서 조건에 맞는 지 체크하는 형식이다.
      우선, 투 포인터에서 중요한 점은 2개의 포인터 중 어떤 걸 옮길지 조건을 제시해주는 것이다.
      원소들을 정렬하고, 포인터를 양쪽 끝에 둔다면...
        
      첫번째 포인터는 가장 작은 값, 두번째 포인터는 가장 큰값을 가지게 된다.
      포인터에 해당하는 두 수의 합이 X보다 작다면, 앞의 포인터를 이동 시키고
      큰 경우는 뒤의 포인터를 이동시키는 방식으로 진행한다.
        
      같은 경우는 어떻게 할까...?
        
      같은 경우는 두 포인터를 모두 이동시킨다.
        
      물론 모든 경우의 수를 보지는 않기에 시간 복잡도가 낮고, X에 가까워지도록 코드를 작성했기 때문에
      X에 해당하는 경우의 수를 모두 찾을 수 있다.
    
  • 답안

      import sys
        
      if __name__ == '__main__':
          N = int(sys.stdin.readline())
          nums = list(map(int, sys.stdin.readline().split()))
          X = int(sys.stdin.readline())
          start = 0
          end = N-1
          count = 0
          nums = sorted(nums)
          while start < end:
              sums = nums[start] + nums[end]
              if sums == X:
                  count += 1
                  start += 1
                  end -= 1
              else:
                  if sums < X:
                      start += 1
                  else:
                      end -= 1
        
          print(count)