문제 내용
제출한 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
// 입력받은 값들을 N 개의 숫자를 공백 단위로 나누어 배열에 저장
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);
int G = 0; // 좋은 수 개수
for (int k = 0; k < N; k++) {
int target = A[k]; // 기준값
int i = 0; // 맨처음
int j = N - 1; // 두번째
while (i < j) {
// 첫번째 포인터가 k와 같은 경우는 건너뛰기
if (i == k) {
i++;
continue;
}
// 두번째 포인터가 k와 같은 경우는 건너뛰기
if (j == k) {
j--;
continue;
}
int sum = A[i] + A[j];
if (sum == target) {
G++;
break; // 더 이상 검사할 필요 없음
} else if (sum < target) {
i++;
} else {
j--;
}
}
}
bw.write(G + "\n");
bw.flush();
bw.close();
br.close();
}
}
후기
이전에 풀이했었던 문제인 주몽의 명령에서 투포인터에 대한 감을 잡았다고 생각했었지만, 정렬된 데이터에서 자기 자신은 좋은 수 만들기에서 카운팅이 되지않아 해당 부분에 대한 예외처리에 방식을 고민했었다
https://huncozyboy.tistory.com/10
백준(1940번, 주몽, 실버IV)
문제 내용제출한 코드import java.io.*;import java.util.*;public class 주몽의명령 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new Bu
huncozyboy.tistory.com
아래 블로그의 내용을 참고해서 왼쪽 포인터의 값이 자시 자신과 같을때는 왼쪽에서 오던 인덱스를 늘려 해당 값에서 벗어나줘야하고, 오른쪽 값이 해당 값과 같을 때에는 왼쪽 값이 0 일 때와 양수인 해당 값일 때니까 오른쪽에서 오던 인덱스를 줄여서 해당 값(자기자신)에서 벗어나줘야 하는 것으로 카운팅 예외처리를 설정하였다
'알고리즘' 카테고리의 다른 글
백준(1193번, 분수찾기, 실버V) (0) | 2025.02.18 |
---|---|
프로그래머스(입국심사, LV3) (0) | 2025.02.14 |
프로그래머스(오픈채팅방, LV2) (1) | 2025.02.12 |
백준(2751번, 수 정렬하기 2, 실버V) (1) | 2025.02.08 |
백준(12891번, DNA 비밀번호, 실버II) (0) | 2025.02.05 |