스킬 뜯어쓰기로 입출력 반복해서 외우고 투 포인터 이동원칙 외우기!
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 한 줄에 숫자 하나 받는 스킬
int N=Integer.parseInt(br.readLine());
int result = 0;
// 1차원 배열 입력 받기 코드
//들어오는 테스트 케이스는 정수! (이게 가장 중요!)
int A[]=new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++){
A[i]=Integer.parseInt(st.nextToken());
}
// 배열 정렬 코드
Arrays.sort(A);
for(int k=0; k<N; k++){ // for문 한번 당 숫자 하나에 대해 좋은 수 판단
long find = A[k];
// 그러므로 다음과 같이 투포인터를 초기화 해야한다.
// 왜 아래와 같이 초기화해야되나? 주몽 문제 참고!
int i=0;
int j=N-1;
while(i<j){
// 투포인터 이동 원칙에 따라 i와 j를 늘릴건데,,,
// 탈출 조건은 어떻게 해줘야 하나?
// 투포인터 조건 1,2,3
if(A[i]+A[j]==find){ // 투포인터 조건1
// 조건1의 세부 조건 뜯기
if(i!=k && j!=k){ //(-5 0), (0, 4) 같은 조건은 좋은수가 아니어서
result++;
break; // 이 때 좋은 수 뽑는 조건인 이유?
}
else if(i==k){
i++;
}
else if(j==k){ // 수가 본인일 때
j--;
}
}
else if (A[i]+A[j]<find) // 투포인터 조건2
{
i++;
}
else { // 투포인터 조건3
j--;
}
}
}
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(String.valueOf(result));
bw.flush();
bw.close();
}
}
[백준 JAVA] 10828 스택 (0) | 2023.01.30 |
---|---|
[백준 JAVA] 1940번 주몽의 명령 (0) | 2023.01.28 |
[백준 Java] 10986 나머지 (0) | 2023.01.14 |
[백준 Java] 11660번 구간 합 구하기 5 (0) | 2023.01.12 |
백준 11659번 구간 합 알고리즘 이용 (0) | 2023.01.08 |
댓글 영역