백준 2470 : 두 용액(C++)

Chanyang Im·2022년 5월 19일
0

BAEKJOON

목록 보기
11/13
post-thumbnail

문제

풀이

기본 아이디어는 정렬을 한 후, 두 원소를 더한 값의 절대값을 최소로 만드는 것을 찾는 것입니다.
처음에는, 밑에 코드처럼 Brute Force로 했습니다.
결과는 시간초과였습니다.

   for(int i = 0; i < size; i++) {
       for(int j = size - 1; j >= i && j != i; j--) {
           int tempSum = solution[i] + solution[j];

           if(abs(tempSum) < abs(sum)) {
               sum = tempSum;
               anwser[0] = solution[i];
               anwser[1] = solution[j];
            }
        }
    }

그래서 다른 방법을 생각했습니다.
더한값의 절대값이 최소가 되는 방향으로만 비교할 수 있도록 코드를 바꿔주었습니다.
앞에서부터 오는 인덱스, 뒤에서부터 오는 인덱스를 조작해서 해결했습니다.
(투포인터)

현재 계산한 값이 음수이면 앞에서 오는 인덱스를 +1해주었고,
양수이면 뒤에서 오는 인데스는 -1해주었습니다.

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution;

void findValue() {
    int sum = 2000000000;
    int size = solution.size();
    int answer[2];

int i = 0;
int j = size - 1;

    while (i < j) {
        int tempSum = solution[i] + solution[j];

        if(abs(sum) > abs(tempSum)) {
            sum = tempSum;
            answer[0] = solution[i];
            answer[1] = solution[j];
            if(sum == 0 ){
                break;
            }
        }

        if(tempSum < 0) {
            i++;
        }
        else {
            j--;
        }
    }
    cout << answer[0] << " " << answer[1];
    }

int main() {
    int N;
    cin >> N;

    while(N--) {
        int value;
        cin >> value;

        solution.push_back(value);
    }
    sort(solution.begin(), solution.end());
    findValue();
    return 0;
}
profile
안녕하세요!! 세상에 관심이 많은 공학자입니다!😆

0개의 댓글