알고리즘

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

'알고리즘' 카테고리의 다른 글

백준 1043번 거짓말 (JAVA)  (0) 2022.01.26
백준 2467번 용액 (JAVA)  (0) 2022.01.25
백준 16948번 데스 나이트 (JAVA)  (0) 2022.01.23
백준 9625번 BABBA (JAVA)  (0) 2022.01.22
백준 1963번 소수 경로 (JAVA)  (0) 2022.01.21