메이쁘

(JAVA) 백준 2470번 : 두 용액 본문

Algorithm/Baekjoon

(JAVA) 백준 2470번 : 두 용액

메이쁘 2020. 5. 29. 00:10

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

 

2470번: 두 용액

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

www.acmicpc.net

 

 

그놈의 시간 초과 때문에 (제한시간 1초)

 

그리고 나만의 이진 탐색 방법을 사용하려고 하다보니

 

예외가 계속 나와서 그거 해결하느라 시간이 오래걸렸다.

 

 

결국에는

 

내 탐색 알고리즘으로 문제를 해결했으나..

*** 실제 이진탐색을 사용하는 방법도 있다.

 

베스트 정답을 보니 

 

이렇게 쉽게 풀 수 있는 방법이 있었어?

 

생각이 들며 

 

이 방법을 공부했다.

*** 정말 감사합니다.. 알고리즘 굇수님들..

 

 

그래서

 

필자가 처음에 구현한 알고리즘 이 아닌

 

베스트 효율적인 알고리즘을 포스팅하겠다.

 

 

 

핵심은 그렇다.

 

 

1) 음수, 양수가 섞인 배열을 우선 오름차순 정렬한다.

 

그렇게 되면 맨 왼쪽은 가장 낮은 음수, 맨 오른쪽은 가장 큰 양수가 자리하게 되고,

 

가운데로 갈수록 점점 절댓값은 작아질 것이다.

 

 

 

2) 그래서 양 끝부터 시작해서 탐색을 진행한다.

 

왼쪽 index를 i , 오른쪽 index를 j 라고 할 때

 

 

i ->    <- j

 

 

로 진행하며 i가 j보다 커지기 전까지 while문을 만족하는 반복문을 짠다.

 

 

3) 그래서 i의 원소와 j의 원소의 합(어떻게 말하면 두 원소 사이의 길이)의 절댓값을 저장하며

 

이전에 계산했던 절댓값보다 큰지 작은지 비교한다.

 

 

만약 이전 절댓값보다 작은 경우

 

정답에 가까워지기 때문에

 

이 두 원소를 별도 저장해두고, 위 절댓값을 이번에 계산해서 나온 절댓값으로 갱신한다.

 

 

이를 위 while문 조건을 벗어날 때 까지 반복한다.

 

 

 

 

그렇게해서 나온 결과가 정답이다.

 

?

 

그렇게해서 나온 별도로 저장한 두 원소가

 

모든 원소들 중 임의로 선택한 두 원소의 차0에 가장 가까운 두 원소라는 뜻이다!

 

 

 

간단한 문제를...

 

아직 부족하다고 느낀다.

 

 

 

 

소스코드를 하단에 첨부하겠습니다.

 

오늘도 항상 웃는 하루가 되었으면 좋겠습니다.

 

감사합니다! :)

 

 

소스코드


Comments