728x90
728x90
반응형
2473번: 세 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상
www.acmicpc.net
세 용액의 합이 0과 가장 근사한 값을 찾아야 한다.
용액의 수가 5000 이하이기 때문에
최악일 경우 5000 * 2500 = 7500000의 연산을 계산하기 때문에
시간 복잡도에 대한 걱정 없이 해결할 수 있었다.
기준점 i번째의 값부터 n-1의 값까지 j번째와 k번째의 합들 중에서 최솟값을 구했다.
여기서 j번째는 i+1, k번째는 n-1번째로 설정하여
투 포인터 알고리즘으로 해결하였다.
i, j, k번째의 합이 비교대상 comp과 비교하여 최솟값과 인덱스 값을 업데이트해주었다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package 투포인터; | |
import java.util.*; | |
public class boj2473 { | |
static Scanner sc = new Scanner(System.in); | |
static int n; | |
static Long [] arr; | |
static void input(){ | |
n = sc.nextInt(); | |
arr = new Long [n]; | |
for(int i=0; i < n ; i++){ | |
arr[i] = sc.nextLong(); | |
} | |
Arrays.sort(arr); | |
} | |
static void solution(){ | |
Long comp = Long.MAX_VALUE; | |
int a=0,b=0,c=0; | |
for(int i=0; i < n ; i ++){ | |
int j = i+1, k = n-1; | |
while (j < k){ | |
Long sum = arr[i] + arr[j] + arr[k]; | |
if(Math.abs(sum) < comp ){ | |
a= i ; b= j ; c = k; comp = Math.abs(sum); | |
} | |
if(sum < 0) j ++; | |
else k --; | |
} | |
} | |
System.out.printf("%d %d %d",arr[a],arr[b],arr[c]); | |
} | |
public static void main(String[] args) throws Exception { | |
input(); | |
solution(); | |
} | |
} |
728x90
728x90
'Language > JAVA' 카테고리의 다른 글
[JAVA] 자바 8 이후 스태틱 객체가 GC 대상이 된 이유 - 컴도리돌이 (0) | 2024.01.17 |
---|---|
[JAVA][백준 11062][게임 이론][DP] 카드 게임 - 컴도리돌이 (0) | 2022.08.21 |
[JAVA][백준 7570][그리디] 줄 세우기 - 컴도리돌이 (0) | 2022.08.19 |
[JAVA][백준 11657][벨만포드] 타임머신 - 컴도리돌이 (0) | 2022.08.18 |
[JAVA][백준 1092][Greedy, Sort] 배 - 컴도리돌이 (0) | 2022.08.17 |