알고리즘/백준
[백준] 1940 -자바
삼록이
2025. 7. 17. 14:55
https://www.acmicpc.net/problem/1940
이 문제는 앞선 문제와 달리 2개의 포인터를 각각 양쪽 끝에 두는게 포인트다.
그리고 오름차순으로 정렬을 해야 포인터들의 이동이 일관되게 가능하다.
public class Main {
public static void main(String[] args) throws IOException {
/*
1.첫째줄에 재료 개수n, 둘째줄에 필요한 수m를 받는다
2.셋째줄에 StringTokenizer를 이용 배열arr에 담는다.
3.투포인터를 사용하기 위해 배열을 오름차순 정렬한다.
4.스타트포인터는 배열의 맨 앞에 , 엔드포인터는 배열의 맨뒤에 두고, 스타트포인터는 오른쪽으로, 엔드포인터는 왼쪽으로 진행방향을 잡는다.
5.while반복하는데 스타트포인터가 엔드포인터보다 작을 동안 계속반복
if(sum==m) 스타트포인터+1
if(sum>m) 엔드포인터-1;
if(sum<m) 스타트포인터+1;
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int[] arr = new int[n];
for(int i=0; i<n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int startPointer =0;
int endPointer = arr.length-1;
int answer =0;
while(startPointer<endPointer){
int sum = arr[startPointer] + arr[endPointer];
if(sum == m){
answer++;
startPointer++;
} else if(sum>m){
endPointer--;
} else{ //sum<m
startPointer++;
}
}
System.out.println(answer);
}
}
이렇게 해도 정답이었으나,
명확하게는 한번 썼던 재료는 다시 못쓰는게 맞으니 sum==일때 startPointer만 ++로 이동시키는 게 아니라 endPointer도 --로 이동시켜야한다. 문제에서는 숫자재료가 중복된 값이 주어지지않아 문제가 없었으나 중복된 값이 주어졌다면 sum == m 일때, 교재처럼 endPointer도 왼쪽으로 이동시키는 것 까지 하는게 맞다.