728x90
반응형
728x90
값을 입력받을 때, 처음에 Scanner를 이용했었다가 시간초과가 4번정도 떴었다.
BufferedReader로 바꾼 후에도 시간초과가 뜨길래
정렬 방식에서 문제가 있나 싶었다.
입력되는 값이 너무 크다보니 범위가 커져서 Arrays.sort()의 경우 최악의 경우는 O(N^2)까지 가는 경우도 있으니
ArrayList로 입력을 받아서 Collections.sort()로 정렬하면 수행시간이 O(N log N)이 보장되기 때문에
리스트로 입력받는 방법을 선택했다.
반응형
그리고 두 포인터 인덱스의 값의 합이 0일 때는 해당 인덱스들을 출력해야하기 때문에
두 포인터를 좁혀나가는 로직에서 break를 걸어주어야 한다.
package twoPointer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
/**
*
* @author dyl1912
*
* https://www.acmicpc.net/problem/2470
* 백준 2470반 두 용액
*
* Arrays.sort()를 안쓰고 Collections.sort()를 쓴 이유는
* Arrays.sort()는 퀵소트 기반으로 정렬을 하는데 최악의 경우 O(n^2)으로 정렬을 하고
* Collections.sort()의 경우는 O(NlogN)을 보장하기 때문이다.
*
* 그리고 sum이 0보다 작거나 클때 비교 외에도 sum 값이 0이면 break를 해주어야 한다.
*/
public class P2470_TwoSolution {
public static void main(String[] args) throws IOException {
P2470_TwoSolution T = new P2470_TwoSolution();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = stoi(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
list.add(stoi(st.nextToken()));
}
int[] answer = T.solution(list, n);
bw.write(answer[0] + " " + answer[1]);
bw.flush();
}
public static int stoi(String str) {
return Integer.parseInt(str);
}
public static int[] solution(ArrayList<Integer> list, int n) {
int[] answer = new int[2];
Collections.sort(list);
int num = Integer.MAX_VALUE;
int lt = 0, rt = n-1;
while(lt < rt) {
int sum = list.get(lt) + list.get(rt);
if(num > Math.abs(sum)) {
num = Math.abs(sum);
answer[0] = list.get(lt);
answer[1] = list.get(rt);
}
if(sum > 0) rt--;
else if(sum < 0) lt++;
else break;
}
return answer;
}
}
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준/java] 2606번: 바이러스 - 인접행렬을 이용한 bfs 풀이 문제 (0) | 2021.11.12 |
---|---|
[백준/java] 1644번: 소수의 연속합 - 투 포인터 + 에라스토테네스의 체 (0) | 2021.09.24 |
[백준/java] 1920: 수 찾기 - 이분 탐색 (0) | 2021.09.23 |
[백준/java] 1806번: 부분합 - 투 포인터 활용 (0) | 2021.09.10 |
[백준/java] 10026번: 적록색약 - DFS (0) | 2021.09.10 |
댓글