백준 2467번(용액)[C/C++]

AJM·2024년 4월 3일

백준 문제 풀이

목록 보기
14/19

🔗링크


1. 문제 풀이

간단한 투포인터 문제

리스트의 첫번째 원소을 가르키는 포인터 i와
리스트의 마지막 원소를 가르키는 포인터 j를 준비한다.

이후 (list[i] + list[j])의 절대값과 기존 최솟값을 비교 후
값이 작다면 두 포인터의 값을 저장한다.

포인터의 이동 알고리즘은 다음과 같다.

list[i] + list[j] = 양수일 경우 => j - 1
list[i] + list[j] = 음수일 경우 => i + 1

합이 양수일 경우 더 작은 값을 더해야 하고
합이 음수일 경우 더 큰 값을 더해봐야 하기에 저런 방식으로 이동하면 된다.

2. 코드

#include<stdio.h>

int list[100000], res1, res2, min = 2000000001;

int main() {
	int N, sum = 0, i = 0, j;
	scanf("%d",&N);
	for (int i = 0; i < N; i++)scanf("%d",&list[i]);
	j = N - 1;
	while (i < j) {
		sum = list[i] + list[j];
		if (min > ((sum > 0)? sum : -sum)) {
			res1 = i;
			res2 = j;
			min = ((sum > 0) ? sum : -sum);
		}
		if (sum >= 0)j--;
		else i++;
	}
	printf("%d %d",list[res1],list[res2]);
	return 0;
}

3. 후기

profile
개발자(진)

0개의 댓글