백준 1253 좋다 C++

마스터피스·2024년 1월 31일

코딩테스트 문제

목록 보기
1/21
post-thumbnail

백준 1253
문제)
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

힌트) 두 수 나온다? 포인트 투 포인트 사용하기

sol)
C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N;
    cin >> N;
    vector<int> A(N, 0);
	// 기본세팅
    
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
	//정렬
    sort(A.begin(), A.end());

    int result = 0;

	//포인트 투 포인트 알고리즘
    for (int k = 0; k < N; k++) {
        long find = A[k];
        int i = 0;
        int j = N-1;

        while (i < j) {
            if (A[i] + A[j] == find) {
                if (i != k && j != k) {
                    result++;
                    break;
                }
                else if (i == k) {
                    i++;

                }
                else if (j == k) {
                    j--;
                }
            }
            else if (A[i] + A[j] < find) {
                i++;
            }
            else {
                j--;
            }

        }

    }
    cout << result << endl;
}

sol2)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int arr[2000];

int main() {
    int num,result=0,val;
    cin>>num;
    for(int i=0;i<num;i++)
        cin>>arr[i];
    sort(arr,arr+num);

    for(int i=0;i<num;i++){
        val = arr[i];     //찾고자 하는 번호
        int l=0,r=num-1,sum;
        while(l<r){
            sum = arr[l]+arr[r];
            if(sum==val){ 
                if(l!=i && r!=i){
                    result++;
                    break;
                }
                else if(l==i) l++;
                else if(r==i) r--;
            }
            else if(sum<val) l++;
            else r--;
        }
    }
    cout<<result;
    return 0;
}
profile
코딩 일지

0개의 댓글