메모리:
- Java: 14664 KB, 시간: 176 ms
- C++: 2020 KB, 시간: 16 ms
이분 탐색, 정렬, 두 포인터
2024년 12월 15일 02:41:29
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
좋은 수의 개수를 첫 번째 줄에 출력한다.
느낀점: 두개를 골라야 하고 정렬이 의미가 있을때, 투포인터 고려하기
설계 시간: 30분 고민해보고 참고함
💡 설계 아이디어
/**
* Author: yngbao97, Yuk Yejin
* Problem: 좋다_1253
* Date: 2024.12.15
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] nums = new int[n];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(nums);
int answer = 0;
for (int i = 0; i < n; i++) {
int left = 0;
int right = n-1;
while (left < right) {
if (left == i) left++;
if (right == i) right--;
if (left >= right) break;
if (nums[left] + nums[right] > nums[i]) right--;
else if (nums[left] + nums[right] < nums[i]) left++;
else {
answer++;
break;
}
}
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
br.close();
}
}
/**
* Author: yngbao97, Yuk Yejin
* Problem: 좋다_1253
* Date: 2024.12.15
*/
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int nums[n];
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
sort(nums, nums + n);
int answer = 0;
for (int i = 0; i < n; i++) {
int left = 0;
int right = n-1;
while (left < right) {
if (left == i) left++;
if (right == i) right--;
if (left >= right) break;
if (nums[left] + nums[right] > nums[i]) right--;
else if (nums[left] + nums[right] < nums[i]) left++;
else {
answer++;
break;
}
}
}
cout << answer << "\n";
}
ex) int nums[3];nums 는 배열의 첫번째 요소를 가리키는 포인터다.nums + n은 배열의 마지막 요소의 다음을 가리키는 포인터다.sizeof(전체 배열) / sizeof(요소 하나) 로 구한다./**
* Author: yngbao97, Yuk Yejin
* Problem: 좋다_1253
* Date: 2024.12.15
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int& num : nums) {
cin >> num;
}
sort(nums.begin(), nums.end());
int answer = 0;
for (int i = 0; i < n; i++) {
int left = 0;
int right = n-1;
while (left < right) {
if (left == i) left++;
if (right == i) right--;
if (left >= right) break;
if (nums[left] + nums[right] > nums[i]) right--;
else if (nums[left] + nums[right] < nums[i]) left++;
else {
answer++;
break;
}
}
}
cout << answer << "\n";
return 0;
}
vector 를 사용하는 것이 더 안전하고 효율적이다.vector<int> nums; // 크기 0으로 선언
vector<int> nums(n); // 크기 n으로 선언, 모든 요소 0으로 초기화
vector<int> nums(n, 5); // 크기 n으로 선언, 모든 요소 5로 초기화