반응형
🔺 문제
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
🔺 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
var br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[] arr = new long[N];
int cnt = 0;
var st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < N ; i++) {
arr[i] = Long.parseLong(st.nextToken());
}
Arrays.sort(arr);
for(int k = 0 ; k < N ; k++) {
long find = arr[k]; // 찾고자 하는 값
int i = 0;
int j = N - 1;
// 투 포인터 알고리즘
while(i < j) {
if(arr[i] + arr[j] == find) {
// 서로 다른 두 수의 합인지 확인
if(i != k && j != k) {
cnt++;
break;
}
else if(i == k) {
i++;
}
else if(j == k) {
j--;
}
}
else if(arr[i] + arr[j] < find) {
i++;
}
else {
j--;
}
}
}
System.out.println(cnt);
br.close();
}
}
✅ 해결 아이디어
- 투 포인터 알고리즘 (두 포인터 위치 : 양 끝!)
- 찾고자하는 값(find)을 배열의 원소에서 하나하나 살펴봄.
- 투 포인터 알고리즘 돌리는 동안, k가 서로 다른 두 수의 합인지 확인하는 조건문 필요 (28-37번째 줄)
누적합 구하는 거 아니면 두 포인터 위치는 양 끝으로 잡고 하면 되는갑다!
고로 투 포인터 두 지점은 앞으로 분리해놓고 시작하는걸로..
암튼 이제 투 포인터 문제 감은 잡혔다! 이제 남은 것은 복습뿐,,,
🔺 다른 풀이들
[BOJ] 1253번: 좋다 (Java)
1253번: 좋다배열의 값들을 하나씩 돌며, 투 포인터를 사용하여 해당 수가 좋은지 판별하였다.문제에 나와있는 예시가 너무 자명하기 때문에 아래 예시로 생각하고 문제를 풀었다.기본적으로 정
velog.io
[백준] 1253번 좋다 (JAVA)
투 포인터를 이용한 문제다. 투 포인터를 둘다 시작 지점으로 놨더니 생각할게 너무 많아지고, 시간복잡도도 증가했다. 투포인터를 시작지점, 끝점으로 양쪽으로 옮겨서 구현했더니 간단하게
komas.tistory.com
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 5597번: 과제 안 내신 분..? (0) | 2023.04.05 |
---|---|
[백준/JAVA] 10809번: 알파벳 찾기 (0) | 2023.04.05 |
[백준/JAVA] 1940번: 주몽 (0) | 2023.04.03 |
[백준/JAVA] 2018번: 수들의 합 5 (0) | 2023.04.03 |
[백준/JAVA] 11660번: 구간 합 구하기 5 (0) | 2023.04.03 |