백준
[백준 / Java] 3273. 두 수의 합
baefrica
2023. 6. 15. 01:29
반응형
https://www.acmicpc.net/problem/3273
3273번: 두 수의 합
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는
www.acmicpc.net
💻 풀이 결과
💯 최종 코드
import java.util.Scanner;
/*
* 시간 복잡도를 생각해서
* O(n²)을 만들면 안된다!
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 입력
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
int x = sc.nextInt();
// tmp 의 범위를 생각해야한다...
boolean[] num = new boolean[2000000];
int cnt = 0;
for (int i : arr) {
// tmp 가 음수일 수도 있음
// 왜? x가 a보다 더 작을 수 있잖아
int tmp = x - i;
// tmp 가 내 앞에 있었나? 확인한다.
// 있었으면? 1쌍 추가
// 중요 : tmp 가 음수일 수도 있다는 걸 생각한다
if (tmp > 0 && num[tmp]) {
cnt++;
}
// 숫자의 존재 여부 체크
num[i] = true;
}
System.out.println(cnt);
}
}
💢 틀린 이유
- 주어지는 숫자 x보다 수열에 포함된 수가 더 큰 경우를 고려하지 못했다.
- 코드에서 tmp의 범위를 잘 고려하지 못했다.
💡 깨달은 점
1. 주어진 n의 크기를 생각해서 시간 복잡도 고려하기
- 시간 복잡도가 O(n²)보다 작도록 구현
2. 구현 아이디어!
- 두 수의 합을 구하기 위해서 배열을 탐색하는 알고리즘인 경우에 O(n)의 시간 복잡도를 가지도록 구현
- 큰 범위의 숫자 배열을 생성하고 차례대로 수열을 탐색하는 데, 이 때 앞에서 체크한 수를 기억하는 아이디어로 구현
반응형