[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)