[BOJ] 2467. ์šฉ์•ก (๐Ÿฅ‡, ์ด๋ถ„ํƒ์ƒ‰, ํˆฌํฌ์ธํ„ฐ)

lemythe423ยท2023๋…„ 12์›” 31์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
92/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

์ด๋ถ„ํƒ์ƒ‰

์ˆซ์ž ํ•˜๋‚˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๊ณ , ๋‚˜๋จธ์ง€ ์ˆซ์ž๋“ค ๊ฐ€์šด๋ฐ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์€ ์ˆซ์ž์™€ ๋”ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ 0์— ๊ฐ€๊นŒ์šธ ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž๋Š” 10๋งŒ๊ฐœ์ด๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋กœ ์ฃผ์–ด์ง„๋‹ค. 10๋งŒ๊ฐœ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด ํ•œ๋ฒˆ์”ฉ ๊ธฐ์ค€ ์ˆซ์ž๋กœ ์ •ํ•˜๊ณ , ๊ธฐ์ค€ ์ˆซ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ˆซ์ž๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ˆซ์ž๋“ค ๊ฐ€์šด๋ฐ ํ•ฉ์ด 0์— ๊ฐ€๊นŒ์šด ์ˆซ์ž ์กฐํ•ฉ์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์ •๋ ฌ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ์ฐพ๋Š” ๊ณผ์ •์€ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

๋ฌธ์ œ์— ์ฃผ์–ด์ง€๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. -99, -2, -1, 4๊ฐ€ ๋ชจ๋‘ ํ•œ ๋ฒˆ์”ฉ ๊ธฐ์ค€ ์ˆซ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๊ธฐ์ค€ ์ˆซ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ๋Œ€ํ•ด์„œ๋งŒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์™ผ์ชฝ ๋ฒ”์œ„์˜ ์ˆซ์ž๋Š” ์ด๋ฏธ ํ•ด๋‹น ์ˆซ์ž๋“ค์ด ๊ธฐ์ค€ ์ˆซ์ž์ผ ๋•Œ ํƒ์ƒ‰์„ ๋๋ƒˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋‘ ๋ฒˆ ์ง„ํ–‰ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋งˆ์ง€๋ง‰ ์ˆซ์ž์ธ 98์€ ํ•ด๋‹น ์ˆซ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์ˆซ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฒ˜์Œ์—๋Š” 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ˆซ์ž๋ฅผ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ, ๋งˆ์ง€๋ง‰์— ํƒ์ƒ‰๋˜๋Š” ์ˆซ์ž๊ฐ€ ํ•ญ์ƒ 0๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ•ฉ์„ ๊ฐ–์ง€๋Š” ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์— ํƒ์ƒ‰ ๋„์ค‘์— ํ•ฉ์ด 0๊ณผ ๊ฐ€๊นŒ์šด ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด answer ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค. ์•„๋ž˜ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์—์„œ -2๊ฐ€ ๊ธฐ์ค€์ผ ๋•Œ -1์ด 0๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ถ„ ํƒ์ƒ‰์„ ๋๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด 103 ์—์„œ ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋‹ต์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋„์ค‘์— ๊ฐ’์„ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•˜๋ฉด -1์ด ์ €์žฅ๋˜๊ณ  ์ข…๋ฃŒ๋œ๋‹ค ์ด ๋ฐฉ์‹์€ ์ด๋ถ„ํƒ์ƒ‰์ด๋‹ค.

4
-100 -2 -1 103
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N;
    static long[] values;
    static long[] binarySearch(long stdNum, int left) {
        int right = N-1;
        int mid = (left + right) / 2;
        long sum;
        long[] answer = new long[] {2_000_000_000, stdNum, values[N-1]};

        while (left <= right) {
            mid = (left + right) / 2;
            sum = stdNum + values[mid];
            if (Math.abs(sum) < answer[0]) {
                answer[0] = Math.abs(sum);
                answer[2] = values[mid];
            }

            if (sum >= 0) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return answer;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        values = new long[N];

        for (int i = 0; i < N; i++) {
            values[i] = sc.nextLong();
        }

        long[] answer = new long[] {2_000_000_000, 0, 0};
        long[] tmp;
        for (int i = 0; i < N-1; i++) {
            tmp = binarySearch(values[i], i+1);
            if (tmp[0] <= answer[0]) {
                answer = tmp;
            }
        }

        System.out.println(answer[1] + " " + answer[2]);

    }
}

ํˆฌ ํฌ์ธํ„ฐ

์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ์ƒํƒœ์ด๋ฏ€๋กœ ๊ฐ€์žฅ ์™ผ์ชฝ ๊ฐ’์„ startIdx ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ endIdx ๋กœ ๋‘๊ณ  ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์˜ ํ•ฉ์ด 0์— ๊ฐ€๊นŒ์šด์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’๋ณด๋‹ค 0์— ๋” ๊ฐ€๊นŒ์šด ๊ฐ’์ด๋ผ๋ฉด ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

startIdx๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ๋”ํ•˜๋Š” ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์ด๊ณ , endIdx๋Š” ๋”ํ•˜๋Š” ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋‘ ๊ฐ’์„ ๋”ํ•œ ํ•ฉ์ด 0๋ณด๋‹ค ์ž‘๋‹ค๋ฉด startIdx๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ํ•ฉ์ด 0์— ๊ฐ€๊นŒ์›Œ์งˆ ํ™•๋ฅ ์ด ๋†’์•„์ง€๊ณ , 0๋ณด๋‹ค ํฌ๋‹ค๋ฉด endIdx๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋ฉด ํ•ฉ์ด 0์— ๊ฐ€๊นŒ์›Œ์งˆ ํ™•๋ฅ ์ด ๋†’์•„์ง„๋‹ค.

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

public class Main {
    static int N;
    static long[] values;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        values = new long[N];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            values[i] = Long.parseLong(st.nextToken());
        }

        long minValue = Long.MAX_VALUE;
        int startIdx = 0;
        int endIdx = N-1;
        long sum;
        int left = 0;
        int right = N-1;
        while (startIdx < endIdx) {
            sum = values[startIdx] + values[endIdx];
            if (Math.abs(sum) < minValue) {
                minValue = Math.abs(sum);
                left = startIdx;
                right = endIdx;
            }

            if (sum < 0) {
                startIdx++;
            } else {
                endIdx--;
            }
        }

        System.out.println(values[left] + " " + values[right]);

    }
}
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€