๐Ÿ€ Knowledge/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋“ค

TIlearn 2023. 9. 4. 13:16

 

 

๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

 

1. ์—์ง€ ๋ฆฌ์ŠคํŠธ
: ์—์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„
: ์—ด์˜ ๊ฐฏ์ˆ˜๋ฅผ 2๊ฐœ๋ฅผ ๋‘๋ƒ, 3๊ฐœ๋ฅผ ๋‘๋ƒ์— ๋”ฐ๋ผ์„œ ๊ฐ€์ค‘์น˜๊ฐ€ ์œ ๋ฌด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
: ๋ฒจ๋งŒ ํฌ๋“œ๋‚˜ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉํ•˜๋ฉฐ, ๋…ธ๋“œ ์ค‘์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. ์ธ์ ‘ ํ–‰๋ ฌ
: ํ–‰๊ณผ ์—ด์— ๊ทธ๋ž˜ํ”„ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.(๊ฐ€๋ น, 1ํ–‰ 2์—ด์— ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ 1์—์„œ 2๋ฅผ ํ–ฅํ•˜๋Š” ์—์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ„)
: ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 1์„ ์ €์žฅํ•˜์ง€๋งŒ, ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

3. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
: ArrayList๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
: ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋‹ค๋ฉด, ArrayList<Integer>[5]์™€ ๊ฐ™์€ ์‹์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
: ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐ ArrayList์˜ ๊ฐ’์— ๋…ธ๋“œ๋ฅผ ๋‘์–ด ๊ฐ€์ค‘์น˜ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
: ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ์ปค๋„ ๊ณต๊ฐ„ ํšจ์œจ์ด ์ข‹๋‹ค.

 

 

 

 

 

 

์ด๋™ ๊ฑฐ๋ฆฌ ์ €์žฅํ•˜๊ธฐ

 

 

BFS๋ฅผ ํ†ตํ•ด์„œ ์ด๋™๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž.

 

18352๋ฒˆ: ํŠน์ • ๊ฑฐ๋ฆฌ์˜ ๋„์‹œ ์ฐพ๊ธฐ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N, ๋„๋กœ์˜ ๊ฐœ์ˆ˜ M, ๊ฑฐ๋ฆฌ ์ •๋ณด K, ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ X๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๋‘ ๊ฐœ

www.acmicpc.net

 

 

import java.nio.Buffer;
import java.util.*;
import java.io.*;

public class Main {
    static int visited[];
    static ArrayList<Integer>[] A;
    static int N, M, K, X;
    static List<Integer> answer;

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        K = sc.nextInt();
        X = sc.nextInt();

        A = new ArrayList[N+1];
        answer = new ArrayList<>();
        for(int i=1; i<=N; i++) {
            A[i] = new ArrayList<Integer>();
        }
        for(int i=0; i<M; i++) {
            int S = sc.nextInt();
            int E = sc.nextInt();

            A[S].add(E);
        }
        visited = new int[N+1];
        for(int i=0; i<=N; i++) {
            visited[i] = -1;
        }
        BFS(X);
        for(int i=0; i<=N; i++) {
            if (visited[i] == K) {
                answer.add(i);
            }
        }
        if (answer.isEmpty()) {
            System.out.println(-1);
        } else {
            Collections.sort(answer);
            for(int temp:answer) {
                System.out.println(temp);
            }
        }

    }

    private static void BFS(int Node) {
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(Node);
        visited[Node]++;
        while(!queue.isEmpty()) {
            int now_Node = queue.poll();
            for(int i : A[now_Node]) {
                if (visited[i] == -1) {
                    visited[i] = visited[now_Node] + 1;
                    queue.add(i);
                }
            }
        }
    }
}

 

- ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•ด์ฃผ๊ธฐ ์œ„ํ•ด visited[i] = visited[now_Node] + 1๋ฅผ ์ ์–ด์ค€๋‹ค.

 

 

 

 

 

์ด๋ถ„ ๊ทธ๋ž˜ํ”„ ๊ตฌํ•˜๊ธฐ

 

 

1707๋ฒˆ: ์ด๋ถ„ ๊ทธ๋ž˜ํ”„

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ทธ๋ž˜ํ”„์˜ ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์—

www.acmicpc.net

 

import java.util.*;
import java.io.*;

public class Main {

    static boolean[] visited;
    static ArrayList<Integer>[] A;

    static boolean IsEven;
    static int[] check;



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

        // for(k๋งŒํผ ๋ฐ˜๋ณต)
        // -> v(๋…ธ๋“œ ๊ฐฏ์ˆ˜), e(์—์ง€ ๊ฐฏ์ˆ˜)
        // for(v์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต)
        // -> ์ดˆ๊ธฐํ™”
        // for(e๋งŒํผ ๋ฐ˜๋ณต)
        // -> ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ ์ €์žฅ

        for(int i=0; i<k; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int v = Integer.parseInt(st.nextToken());
            int e = Integer.parseInt(st.nextToken());

            A = new ArrayList[v+1];
            visited = new boolean[v+1];
            check = new int[v+1];
            IsEven = true;

            for(int j=1; j<=v; j++) {
                A[j] = new ArrayList<>();
            }
            for(int j=0; j<e; j++) {
                st = new StringTokenizer(br.readLine());
                int S = Integer.parseInt(st.nextToken());
                int E = Integer.parseInt(st.nextToken());

                A[S].add(E);
                A[E].add(S);
            }
            // for(v์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต)
            // -> ๊ฐ ๋…ธ๋“œ์—์„œ DFS ์‹คํ–‰ -> ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ข…๋ฃŒ

            for(int j=1; j<=v; j++) {
                if (IsEven) {
                    DFS(j);
                } else {
                    break;
                }
            }

            if (IsEven) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }

        }


    }
    // DFS๊ตฌํ˜„
    // if (ํ˜„์žฌ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋กœ)
    // -> ํ˜„์žฌ ๋…ธ๋“œ์™€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์œผ๋กœ ์—ฐ๊ฒฐ ๋…ธ๋“œ ์ €์žฅ
    // -> DFS์‹คํ–‰

    // else (๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ธ๋ฐ, ๊ฐ™์€ ์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ)
    // -> ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹˜
    public static void DFS(int Node) {
        visited[Node] = true;

        for(int i: A[Node]) {
            if (!visited[i]) {
                check[i] = (check[Node] + 1) % 2;
                DFS(i);
            } else if (check[Node] == check[i]) {
                IsEven = false;
            }
        }
    }
}

 

 

์ธ์ ‘ ์š”์†Œ๊ฐ€ ๊ฐ™์€ ๊ทธ๋ฃน์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ check๋ผ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

- check[i] = (check[Node] + 1) % 2๋ฅผ ํ†ตํ•ด์„œ, ์ƒˆ๋กญ๊ฒŒ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฐ์—ด์ด ์–ด๋А ๊ทธ๋ฃน์— ์†ํ•ด์žˆ๋Š” ์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

๊ทธ๋ž˜ํ”„๋ฅผ ์—ญ์œผ๋กœ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹

 

์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ €์žฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋Š” ๋ฐ˜๋Œ€๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ์—ญ์œผ๋กœ ๊ทธ๋ฆฌ๋ฉฐ ์ ‘๊ทผํ•œ๋‹ค.

 

 

2251๋ฒˆ: ๋ฌผํ†ต

๊ฐ๊ฐ ๋ถ€ํ”ผ๊ฐ€ A, B, C(1≤A, B, C≤200) ๋ฆฌํ„ฐ์ธ ์„ธ ๊ฐœ์˜ ๋ฌผํ†ต์ด ์žˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์•ž์˜ ๋‘ ๋ฌผํ†ต์€ ๋น„์–ด ์žˆ๊ณ , ์„ธ ๋ฒˆ์งธ ๋ฌผํ†ต์€ ๊ฐ€๋“(C ๋ฆฌํ„ฐ) ์ฐจ ์žˆ๋‹ค. ์ด์ œ ์–ด๋–ค ๋ฌผํ†ต์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์„ ๋‹ค๋ฅธ ๋ฌผํ†ต์œผ๋กœ ์Ÿ์•„ ๋ถ€

www.acmicpc.net

 

 

import java.util.*;
import java.io.*;

public class Main {
    static int[] Sender = { 0, 0, 1, 1, 2, 2 };
    static int[] Receiver = { 1, 2, 0, 2, 0, 1};
    static boolean visited[][];
    static boolean answer[];
    static int now[];

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        now = new int[3];
        now[0] = sc.nextInt();
        now[1] = sc.nextInt();
        now[2] = sc.nextInt();

        visited = new boolean[201][201];
        answer = new boolean[201];
        BFS();

        for(int i =0; i<answer.length; i++) {
            if (answer[i]) System.out.print(i + " ");
        }

    }

    public static void BFS() {
        Queue<AB> queue = new LinkedList<>();
        queue.add(new AB(0, 0));
        visited[0][0] = true;
        answer[now[2]] = true;
        while(!queue.isEmpty()) {
            AB p = queue.poll();
            int A = p.A;
            int B = p.B;
            int C = now[2] - A-B;

            for(int k = 0; k<6; k++){
                int[] next = { A, B, C };
                next[Receiver[k]] += next[Sender[k]];
                next[Sender[k]] = 0;
                if (next[Receiver[k]] > now[Receiver[k]]) {
                    next[Sender[k]] = next[Receiver[k]] - now[Receiver[k]];
                    next[Receiver[k]] = now[Receiver[k]];
                }
                if(!visited[next[0]][next[1]]) {
                    visited[next[0]][next[1]] = true;
                    queue.add(new AB(next[0], next[1]));
                    if (next[0] == 0) {
                        answer[next[2]] = true;
                    }
                }
            }

        }
    }
}

class AB {
    int A;
    int B;
    public AB (int A, int B) {
        this.A = A;
        this.B = B;
    }
}

 

 

 

- Sender์™€ Receiver๋ฅผ ํ†ตํ•ด์„œ, ์ด๋™ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ„์—ˆ๋‹ค.

- visited ๋ฐฐ์—ด์€ A,B๋ฌด๊ฒŒ๋งŒ ์žˆ์œผ๋ฉด ํ•˜๋‚˜๋Š” ๊ณ ์ •๋˜๋ฏ€๋กœ 2์ฐจ์›์œผ๋กœ ๊ณ ์ •ํ•˜์˜€๋‹ค.

- BFS()ํ•จ์ˆ˜ ์•ˆ์— queue๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ A,B ๋ฌด๊ฒŒ๋ฅผ ์ €์žฅํ•˜๊ณ  6๊ฐ€์ง€ ์ด๋™ ์ผ€์ด์Šค๋ฅผ ๋”ฐ์ ธ๊ฐ€๋ฉฐ ๋ฌผ์„ ์ €์žฅํ•˜์˜€๋‹ค.

- ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์„ ์ฒดํฌํ•˜๊ณ , ๋ถ€ํ•ฉํ•œ๋‹ค๋ฉด A์˜ ๋ฌผ์˜ ์–‘์ด 0์ผ ๋•Œ ์ •๋‹ต ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

 

 

 

 

 

Reference

 

- Do it! ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - ๊ธฐ๋ณธ ํŽธ