์ต๊ทผ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฉด์ ์๊ฐ ์ด๊ณผ์ ์์ธ์ฒ๋ฆฌ๋ก ์ธํด ์๋นํ ์ ๋ฅผ ๋จน์๋ ๋ฌธ์ ๊ฐ ์๋ค. ํด๋น ๋ฌธ์ ์ ๋ค๋ฅธ ํ์ด๋ฅผ ์ฐพ์๋ณด๋ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค๋ ์ ์ ์์๊ณ ์ด์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ํ๋์ ๋ฐฐ์ด์์ ๋ ๊ฐ์ ์ธ๋ฑ์ค ํฌ์ธํฐ๋ฅผ ์กฐ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธํ๋ค. ๋ฌธ์ ๋ฅผ ์์๋ก ๋ค์ด์ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ฐฑ์ค - 2467. ์ฉ์ก
์ด ๋ฌธ์ ์์ 0๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ํฉ์ ๊ฐ์ง๋ ๋ ์์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋จผ์ O(N^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค. ํ์ง๋ง ๋ฌธ์ ์ฒ๋ผ N์ ํฌ๊ธฐ๊ฐ O(N^2)์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ์ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด O(N)์ ํด๋น ๊ฐ์ ๊ตฌํ ์ ์๋ค. (์ด ๋ฌธ์ ๋ ์ ๋ ฌ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๋ฌธ์ ์ ์๊ฐ๋ณต์ก๋๋ O(NlogN)์ด๋ค. ํ์ง๋ง ํฌํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ O(N)์ด๋ค.)
ํ์ด ๋ฐฉ๋ฒ์ ๋จผ์ ์ฉ์ก์ ํน์ฑ๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ Left : 0 / Right : N - 1๋ก ์ด๊ธฐ๊ฐ์ ์ค์ ํ ํ์ ํน์ฑ๊ฐ์ ํฉ์ ๊ตฌํ๋ค. ๋ง์ฝ left์ ํน์ฑ๊ฐ๊ณผ right์ ํน์ฑ๊ฐ์ ํฉ์ด 0๋ณด๋ค ์์ผ๋ฉด 0๊ณผ ๊ฐ๊น์์ง๊ธฐ ์ํด์๋ left๋ฅผ ๋ ํฐ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค. ๋ฐ๋ ๊ฒฝ์ฐ์๋ right๋ฅผ ๋ ์์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค. ์ด ๊ณผ์ ์์ 0๊ณผ์ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ๊ฐฑ์ ํ๋ฉด์ ์งํํ๋ฉด O(N)์ ์ต์๊ฐ์ ๊ตฌํ ์ ์๋ค.
Java๋ก ์์ฑํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Solution2467 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(br.readLine());
int[] map = new int[N];
String[] input = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
map[i] = Integer.parseInt(input[i]);
}
Arrays.sort(map);
int left = 0, right = N - 1;
int min = Integer.MAX_VALUE;
int[] answer = new int[2];
while(left < right) {
int sum = map[right] + map[left];
if (min > Math.abs(sum)) {
min = Math.abs(sum);
answer[0] = map[left];
answer[1] = map[right];
}
if (sum > 0)
right--;
else
left++;
}
System.out.println(answer[0] + " " + answer[1]);
}
}
TMI
ํด๋น ๋ฌธ์ ์ ๋ํด ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ง ์์ ํ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Solution2470 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
ArrayList<Integer> positive = new ArrayList<>();
ArrayList<Integer> negative = new ArrayList<>();
int N = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
for (int i = 0; i < N; i++) {
int cur = Integer.parseInt(input[i]);
if (cur > 0)
positive.add(cur);
else
negative.add(cur);
}
positive.sort(Integer::compareTo);
negative.sort(Collections.reverseOrder());
int positiveMin = (positive.size() >= 2) ? Math.abs(positive.get(0) + positive.get(1)) : Integer.MAX_VALUE;
int negativeMin = (negative.size() >= 2) ? Math.abs(negative.get(0) + negative.get(1)) : Integer.MAX_VALUE;
int[] result = new int[2];
int min = Math.min(positiveMin, negativeMin);
int positiveIdx = 0;
int negativeIdx = 0;
int positiveDidx = 0;
int negativeDidx = 1;
int curPos = -1000000001, curNeg = 1000000001;
while (positiveIdx < positive.size() && negativeIdx < negative.size()) {
curPos = positive.get(positiveIdx);
curNeg = negative.get(negativeIdx);
int curMin = Integer.MAX_VALUE;
int[] temp = new int[2];
while(positiveIdx < positive.size() && negativeIdx < negative.size()) {
curPos = positive.get(positiveIdx);
curNeg = negative.get(negativeIdx);
if (curMin < Math.abs(curPos + curNeg)) {
positiveIdx -= positiveDidx;
negativeIdx -= negativeDidx;
positiveDidx = (positiveDidx + 1) % 2;
negativeDidx = (negativeDidx + 1) % 2;
break;
}
curMin = Math.abs(curPos + curNeg);
temp[0] = curNeg;
temp[1] = curPos;
positiveIdx += positiveDidx;
negativeIdx += negativeDidx;
}
if (min > curMin) {
min = curMin;
result[0] = temp[0];
result[1] = temp[1];
}
positiveIdx += positiveDidx;
negativeIdx += negativeDidx;
}
positiveIdx = (positiveIdx == positive.size()) ? positiveIdx - 1 : positiveIdx;
negativeIdx = (negativeIdx == negative.size()) ? negativeIdx - 1 : negativeIdx;
while (!positive.isEmpty() && positiveIdx < positive.size()) {
curPos = positive.get(positiveIdx++);
if (min > Math.abs(curPos + curNeg)) {
min = Math.abs(curPos + curNeg);
result[0] = curNeg;
result[1] = curPos;
}
}
while (!negative.isEmpty() && negativeIdx < negative.size()) {
curNeg = negative.get(negativeIdx++);
if (min > Math.abs(curPos + curNeg)) {
min = Math.abs(curPos + curNeg);
result[0] = curNeg;
result[1] = curPos;
}
}
if (negativeMin <= positiveMin && negativeMin <= min) {
System.out.println(negative.get(1) + " " + negative.get(0));
} else if (positiveMin <= negativeMin && positiveMin <= min) {
System.out.println(positive.get(0) + " " + positive.get(1));
} else if (min <= positiveMin && min <= negativeMin) {
System.out.println(result[0] + " " + result[1]);
}
}
}
์ด ๋ฐฉ๋ฒ์ ์์ ๋ฐฐ์ด๊ณผ ์์ ๋ฐฐ์ด๋ก ๋๋์ด์ ํน์ฑ๊ฐ์ ํฉ์ ๊ตฌํ๋ ๋ฐฉ์์ ์งํํ๋ค. ์์์ ์์๋ฅผ ์ ๋๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ํ์ ํด๋น ์ธ๋ฑ์ค์์ ํน์ฑ๊ฐ์ ์ ๋๊ฐ์ ๊ณ์ฐํ๋ฉด์ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์ธ๋ฑ์ค ์กฐ์ ๋ฐ ์ฒ๋ฆฌํด์ผ ํ ์์ธ ์ผ์ด์ค๊ฐ ๋๋ฌด ๋ง์ ๋ณต์กํ ์ฝ๋๊ฐ ๋์๋ค. ๋ค๋ฅธ ํฌ ํฌ์ธํฐ ๋ฌธ์ ๋ฅผ ๋ง์ด ํ์ด๋ด์ผ๊ฒ ๋ค.
'๐ Algorithm > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ๋ ์ ๋ฆฌ] ์ต๋จ ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ - ๋ค์ต์คํธ๋ผ (0) | 2021.03.22 |
---|---|
[๊ฐ๋ ์ ๋ฆฌ] ์ต๋จ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ - ํ๋ก์ด๋ ์์ฌ (0) | 2021.03.16 |
[๊ฐ๋ ์ ๋ฆฌ] ์ค์ํ ์๊ณ ๋ฆฌ์ฆ (0) | 2021.02.26 |
[๊ฐ๋ ์ ๋ฆฌ] ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ (0) | 2021.02.19 |
๋๊ธ