알고리즘
백준 1253번 좋다 (JAVA)
박카스마시며코딩
2022. 1. 24. 11:22
https://www.acmicpc.net/problem/1253
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
먼저 저는 처음에 이분탐색을 생각하고 문제풀이를 진행하였습니다.
계속 틀리길래 문제를 다시 보니 마지막 줄의 '수의 위치가 다르면 값이 같아도 다른 수이다.'의 의미를 이해하였습니다.
3
0 0 0
다음과 같이 입력이 들어온다면 결과값이 3이 나와야합니다.
또한 이분 탐색으로 하게 되면 같은 수가 존재하면 같은 수 중에 어떤 인덱스를 줄지 모릅니다.
그래서 저는 해당 문제를 Map을 이용하여 문제를 해결하였습니다.
Map을 통해 해당 숫자가 몇번 나왔는지를 체크하였습니다.
그리고 2중 for문을 통해 i번째 수를 j번째 수와 다른 수를 합해서 표현할 수 있는가를 찾았습니다.
i번째 수와 j번째 수의 차를 map에서 찾고 있다면 이것이 i번째와 j번째의 수와 같은지를 확인하고 찾다면 각각의 경우 1씩 줄여주었습니다. 이 값이 1이상이라면 결과값을 늘려주어 문제를 해결하였습니다.
package BOJ.ETC;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_1253 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int[] input = new int[n];
st = new StringTokenizer(br.readLine());
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < n ;i++){
input[i] = stoi.apply(st.nextToken());
map.merge(input[i],1,(o1,o2) -> o1 + 1);
}
int result = 0;
for(int i = n-1 ; i >= 0 ; i--){
for(int j = n-1 ; j >= 0 ; j--){
if(i == j){
continue;
}
int num = input[i] - input[j];
if(map.containsKey(num)){
int cnt = map.get(num);
if(input[i] == num){
cnt--;
}
if(input[j] == num){
cnt--;
}
if(cnt > 0){
result++;
break;
}
}
}
}
System.out.println(result);
}
}