Koder / 박성훈
article thumbnail

정보올림피아드 2010년 중등부 1번 문제이다.

중등부 1번을 오래걸리는 능지수준 ㅠ

https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

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

int arr[100001] = {0};
int n;
long long int min = 2000000001;

int main(){
	scanf("%d", &n);
	
	for(int i=0; i<n; i++){
		scanf("%d", &arr[i]);
	}
	
	std::sort(arr, arr+n);
	int fp=0, ep=n-1; // 두 배열 인덱스 선언. 
	int v1, v2; // 두 용액 선언. 
	while(fp!=ep){
		if(min >= abs(arr[fp]+arr[ep])){
			v1 = arr[fp];
			v2 = arr[ep];
			min = abs(arr[fp]+arr[ep]);
		}
		if(arr[fp]+arr[ep]>0) ep--;
		else if(arr[fp]+arr[ep]<=0) fp++;
	}
	printf("%d %d", v1, v2);
}

배열을 한번 정렬해주고 시작한다.

두 인덱스를 저장해주는 fp(front pointer)와 ep(end pointer) 를 만들어줬고,

fp는 가장 작은 숫자를, ep는 가장 큰 숫자의 인덱스값을 가리킬 수 있도록 해주었다.

둘을 더한 합의 절댓값이 최솟값이 0에 가장 가까운 수가 될 것이므로, abs()를 씌워서 최소값과 비교하는 if문이 있고,

둘의 합이 양수인 경우에는 둘의 합을 줄여야 하므로,

ep가 가리키는 가장 큰 숫자의 인덱스값을 1 줄여서

둘의 합이 줄어들 수 있게 해주었고,

둘의 합이 음수인 경우에는 둘의 합을 늘려야 하므로,

fp가 가리키는 가장 작은 숫자의 인덱스값을 1 늘려서

둘의 합이 늘어날 수 있도록 해주었다.

이렇게 하나씩 비교해가며 최솟값을 찾다가, fp == ep 가 되어 둘이 같은 값을 가리키는 경우 프로그램을 종료시키고,

결과를 출력시켜주면 이 문제를 해결할 수 있다.

백준에서 풀어낸 첫 골드 문제다.

실력이 조금씩 조금씩 늘고있는것 같긴 하다.

플래/다이아 문제를 풀어내는 그날까지 노동 ON.

반응형