๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[ํˆฌ ํฌ์ธํ„ฐ] 1. ๋‘ ๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2023. 12. 23.

 

ํˆฌ ํฌ์ธํ„ฐ(Two Pointers)
  • ๋ฆฌ์ŠคํŠธ์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ ๋‘ ๊ฐœ์˜ ์ ์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ •๋ ฌ ๋˜์–ด ์žˆ๋Š” ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์ง‘ํ•ฉ์—๋„ ์‚ฌ์šฉ๋œ๋‹ค. ๋ณ‘ํ•ฉ์ •๋ ฌ(merge sort)์˜ counquer ์˜์—ญ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„

 

 
 
 
1. ๋‘ ๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ
 

์„ค๋ช…

์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋œ ๋‘ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋ฉด ๋‘ ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ํ•ฉ์ณ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ N(1<=N<=100)์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์— N๊ฐœ์˜ ๋ฐฐ์—ด ์›์†Œ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์ค„์— ๋‘ ๋ฒˆ์งธ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ M(1<=M<=100)์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

๋„ค ๋ฒˆ์งธ ์ค„์— M๊ฐœ์˜ ๋ฐฐ์—ด ์›์†Œ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋Š” intํ˜• ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ

์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ž…๋ ฅ 1 

3
1 3 5
5
2 3 6 7 9

์˜ˆ์‹œ ์ถœ๋ ฅ 1

1 2 3 3 5 6 7 9
 

 

 

<<ํ’€์ด>>

 

-๋‚˜์˜ ํ’€์ด-

์‹œ๊ฐ„๋ณต์žก๋„ : O(N)

Arrays.sort()๋ฅผ ํ™œ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

import java.util.*;

class Main {

    public int[] solution(int N, int M, int[] arr1, int[] arr2) {
        int[] answer = new int[N + M];
        int index = 0;
        for (int x : arr1) {
            answer[index++] = x;
        }
        for (int y : arr2) {
            answer[index++] = y;
        }

        Arrays.sort(answer);

        return answer;

    }



    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] arr1 = new int[N];
        for (int i=0; i<N ; i++) {
            arr1[i] = in.nextInt();
        }
        int M = in.nextInt();
        int[] arr2 = new int[M];
        for (int j=0; j<M; j++) {
            arr2[j] = in.nextInt();
        }
        for (int x : T.solution(N, M, arr1, arr2)) {
            System.out.print(x + " ");
        }

    }
}

 

์ฒ˜์Œ์—๋Š” ArrayList๋ฅผ ํ™œ์šฉํ•ด์„œ ํ’€๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, list ์ •๋ ฌ์— ๋Œ€ํ•ด ์ž˜ ๋ชป ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ Arrays๋กœ ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค. 

ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” 'ํˆฌ ํฌ์ธํ„ฐ' ํ™œ์šฉ์ด ๊ด€๊ฑด์ธ๊ฑด ๋ถ„๋ช…ํ•˜๋‹ค.

 

-๊ฐ•์‚ฌ๋‹˜ ํ’€์ด-

์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N)

 

import java.util.*;

class Main {

    public ArrayList<Integer> solution(int N, int M, int[] arr1, int[] arr2) {
       ArrayList<Integer> answer = new ArrayList<>();
       int p1 = 0, p2 = 0;
       while(p1 < N && p2 < M) {
           if(arr1[p1] < arr2[p2]) answer.add(arr1[p1++]);
           else answer.add(arr2[p2++]);
       }
       while(p1 < N) answer.add(arr1[p1++]);
       while(p2 < M) answer.add(arr2[p2++]);
       
       return answer;
    }



    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] arr1 = new int[N];
        for (int i=0; i<N ; i++) {
            arr1[i] = in.nextInt();
        }
        int M = in.nextInt();
        int[] arr2 = new int[M];
        for (int j=0; j<M; j++) {
            arr2[j] = in.nextInt();
        }
        for (int x : T.solution(N, M, arr1, arr2)) {
            System.out.print(x + " ");
        }

    }
}

 

^^ ์ฒ˜์Œ์— ๋‚ด๊ฐ€ ํ•˜๋ ค๋˜ ArrayList๋ฅผ ์•„์ฃผ ๋ฉ‹์ง€๊ฒŒ ํ‘ธ์…จ๋‹ค ใ…Žใ…Ž ^^

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด ํˆฌ ํฌ์ธํ„ฐ ์ด๋‹ค. ๋‘ ๊ฐœ์˜ ์ ์˜ ์œ„์น˜์™€ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ˜•ํƒœ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์ด ๋ฌด์Šจ ๋А๋‚Œ์ธ์ง€๋Š” ์•Œ๊ฒ ์œผ๋‚˜, ํ™• ์™€๋‹ฟ์ง€๋Š” ์•Š๋Š”๋‹ค.

 

ํ™•์‹คํ•œ๊ฑด ๋‘ ๊ฐœ ํฌ์ธํ„ฐ์˜ ์ด๋™์ด ์žˆ์œผ๋ฉด์„œ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ list์— add ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

๋Œ“๊ธ€