본문 바로가기
알고리즘 문제풀이/백준

[백준 1253] 좋다

by m2162003 2020. 11. 27.

www.acmicpc.net/problem/1253

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

투포인터 문제

 

처음 접근: 정렬을 한 후 0부터 i-1번째 사이에서 두 개의 합 == arr[i]를 찾는다.

 

틀림 -> 음수도 존재하기 때문에 -5 5 15에서 5를 찾는다면 15도 체크해야함.

 

따라서 0부터 n-1까지 모든 정렬된 배열을 순회하면서 arr[i]값을 찾는다. 단, l이나 r이 i와 같은 경우엔 값을 바꿔줘야 한다.

 

#include <stdio.h>
#include <algorithm>

using namespace std;
int arr[2000];
int main(void)
{
  int n, result = 0;
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    scanf("%d", &arr[i]);
  }

  sort(arr, arr + n);

  for (int i = 0; i < n; i++)
  {
    int l = 0, r = n - 1;

    if (i == 0)
    {
      l = 1;
    }

    if (i == n - 1)
    {
      r = n - 2;
    }

    while (l < r)
    {
      int sum = arr[l] + arr[r];

      if (sum > arr[i])
      {

        r--;
        if (r == i)
        {
          r--;
        }
      }
      else if (sum < arr[i])
      {
        l++;
        if (l == i)
        {
          l++;
        }
      }
      else
      {
        result++;
        break;
      }
    }
  }
  printf("%d\n", result);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1181] 단어 정렬  (0) 2020.11.28
[백준 7785] 회사에 있는 사람  (0) 2020.11.28
[백준 2467] 용액  (0) 2020.11.27
[백준 14921] 용액 합성하기  (0) 2020.11.27
[백준 1822] 차집합  (0) 2020.11.27

댓글