[BOJ] (3273) 두 수의 합 (Java)

zerokick·2023년 4월 21일
0

Coding Test

목록 보기
60/120
post-thumbnail

(3273) 두 수의 합 (Java)


시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초128 MB3530312561948434.954%

문제

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)

출력

문제의 조건을 만족하는 쌍의 개수를 출력한다.

예제 입력 1

9
5 12 7 10 9 1 2 3 11
13

예제 출력 1

3

출처

Olympiad > Balkan Olympiad in Informatics > Junior Balkan Olympiad in Informatics > JBOI 2008 6번
데이터를 추가한 사람: BaaaaaaaaaaarkingDog
문제를 번역한 사람: baekjoon

알고리즘 분류

정렬
두 포인터

Solution

1

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] arr = br.readLine().split(" ");
        int x = Integer.parseInt(br.readLine());

        Arrays.sort(arr);

        int findVal = 0;
        int idx = 0;
        int answer = 0;

        for(int i = 0; i < n; i++) {
            findVal = x - Integer.parseInt(arr[i]);
            arr[i] = "";
            idx = Arrays.binarySearch(arr, String.valueOf(findVal));
            if(idx >= 0) {
                answer++;
            }
        }

        System.out.println(answer);
    }
}

2

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        int answer = 0;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        boolean[] boolArr = new boolean[2000001];
        for(int i = 0; i < n; i++) {
            boolArr[Integer.parseInt(st.nextToken())] = true;
        }

        st = new StringTokenizer(br.readLine());
        int x = Integer.parseInt(st.nextToken());
        for(int i = 1; i <= x; i++) {
            if(boolArr[i] && boolArr[x-i]) {
                answer++;
            }
        }

        System.out.println(answer/2);
    }
}

Feedback

sol 1 보다 sol 2가 메모리와 시간을 덜 잡는다.
충분히 선언 가능한 범위의 배열이면 램프 점등의 방법으로 모든 수를 배열에 담아서, 답을 찾는 방법을 생각해볼것

profile
Opportunities are never lost. The other fellow takes those you miss.

0개의 댓글

관련 채용 정보