알고리즘

백준 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);
    }
}