[๋ฐฑ์ค€] 13023 : ABCDE - JAVA

Benjaminยท2022๋…„ 12์›” 19์ผ
0

BAEKJOON

๋ชฉ๋ก ๋ณด๊ธฐ
25/70

๐Ÿ™‹๐Ÿปโ€โ™€๏ธDFS ์ด์šฉ!

๋ฌธ์ œ๋ถ„์„

N,M์˜ ์ตœ๋Œ€๋ฒ”์œ„๊ฐ€ 2000์ด๋ฏ€๋กœ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์ผ์„ ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(4000)์ด๋‹ค.
์ด๋ฅผ ๋ชจ๋“  ๋…ธ๋“œ์— ์ง„ํ–‰ํ–ˆ์„๋•Œ 2000 * 4000 = 8000000์ด๋ฏ€๋กœ DFS๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.์ฃผ์–ด์ง„ ๋ชจ๋“  ๋…ธ๋“œ์— DFS ์ˆ˜ํ–‰์žฌ๊ท€์˜ ๊นŠ์ด๊ฐ€ 5์ด์ƒ(5๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žฌ๊ท€ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ)์ด๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

Troubleshooting

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		freind = new ArrayList[N];
		for(int i =0; i<N; i++) {
			freind[i] = new ArrayList<>();
		}
		sc.nextLine();
		for(int i =0; i<M; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
		    freind[a].add(b);
		    freind[b].add(a);
		    sc.nextLine();
		}
		visited = new boolean[N];
		for(int i =0; i<N; i++) {
			int answer = DFS(i,1);
			if(answer == 1) {
		    	System.out.println("1");
		        return;
		    }
			for(int j=0; j<N; j++) {
				visited[j] = false;
			}
		}
		System.out.println("0");
		return;
	}
	public static int DFS(int person,int depth){
	    if(depth == 5) {
	    	return 1;
	    }
	    visited[person] = true;
	    for(int i : freind[person]) {
	    	if(!visited[i]) {
            	depth++;
	    		DFS(i,depth);
	        }
	    }
	    return 0;
	}
}

๋ฌธ์ œ

์–ด๋–ค ์˜ˆ์ œ๋ฅผ ๋„ฃ๋“  ๋ฌด์กฐ๊ฑด 0์ด ์ถœ๋ ฅ๋๋‹ค.

์›์ธ

์–ด๋–ค ํ•˜๋‚˜์˜ ๋ฃจํŠธ๋ฅผ ์ญ‰ ๊ฒ€์‚ฌํ•˜๋‹ค๊ฐ€, ์นœ๊ตฌ๊ฒ€์‚ฌ๊ฐ€ ๋‹ค ๋๋‚˜์„œ depth๋ฅผ ํ•˜๋‚˜ ์ด์ „์œผ๋กœ ๊ฐ€์„œ ๊ทธ ๋‹ค์Œ๋ถ€๋ถ„์„ ๊ฒ€์‚ฌํ• ๋•Œ๋Š” depth๋„ ๋™์ผํ•˜๊ฒŒ -1์ด ๋˜์–ด์•ผํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€์•Š๊ณ  ์–ด๋–ค ์ƒํ™ฉ์ด๋“  depth๊ฐ€ ๊ณ„์† ๋ˆ„์ ๋˜์–ด์„œ ๊ฐ€๋Šฅํ•˜์ง€์•Š์€๊ฒฝ์šฐ์—๋„ depth๊ฐ€ ๋ˆ„์ ๋˜๋ฉฐ, ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜์ˆ˜๊ฐ€ 5๋ฒˆ ์ดˆ๊ณผ์ด๋ฉด ๋งˆ์ง€๋ง‰์ค„์˜ return 0์ด ์‹คํ–‰๋ผ์„œ ๊ทธ๋Ÿฐ๊ฒƒ์ด๋‹ค.

ํ•ด๊ฒฐ

for๋ฌธ ๋‚ด์—์„œ depth ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๋Š” ํ–‰์œ„๋Š” ์œ„ํ—˜ํ•˜๋‹ค!!
DFS๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœํ•  ๋•Œ, ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ , ๊ฐฑ์‹ ํ•ด์ฃผ๋Š”์ผ์€ ํ•˜์ง€๋ง์ž.
DFS(i,depth+1) ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

Troubleshooting 2

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		freind = new ArrayList[N];
		for(int i =0; i<N; i++) {
			freind[i] = new ArrayList<>();
		}
		sc.nextLine();
		for(int i =0; i<M; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
		    freind[a].add(b);
		    freind[b].add(a);
		    sc.nextLine();
		}
		visited = new boolean[N];
		for(int i =0; i<N; i++) {
			int answer = DFS(i,1);
			if(answer == 1) {
		    	System.out.println("1");
		        return;
		    }
			for(int j=0; j<N; j++) {
				visited[j] = false;
			}
		}
		System.out.println("0");
		return;
	}
	public static int DFS(int person,int depth){
	    if(depth == 5) {
	    	return 1;
	    }
	    visited[person] = true;
	    for(int i : freind[person]) {
	    	if(!visited[i]) {
	    		DFS(i,depth+1);
	        }
	    }
	    return 0;
	}
}

๋ฌธ์ œ

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ 1์ด ๋‚˜์™€์•ผํ•˜๋Š” ์˜ˆ์ œ์—์„œ 0์ด ์ถœ๋ ฅ๋œ๋‹ค.

์›์ธ

depth๊ฐ€ 5๋ฅผ ์ฐ์œผ๋ฉด return1์ด ๋˜๊ณ , ๊ทธ ํ›„ ์žฌ๊ท€ํ˜ธ์ถœ์„ ๋น ์ ธ๋‚˜์˜ค๋ฉฐ ์ด์ „ depth๋“ค์ด ์ ์šฉ๋˜์–ด ์ตœ์ข…์ ์œผ๋กœ 0์ด ์ถœ๋ ฅ๋˜๋Š”๊ฒƒ์ด์—ˆ๋‹ค.

ํ•ด๊ฒฐ

DFS๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ํ•œ ๋ฒˆ 1์„ ์ฐ์€ํ›„์—๋Š” ๊ณ„์† return 1์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก, DFS ์žฌ๊ท€ํ˜ธ์ถœ์— ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๊ณ , ํ•ด๋‹น ๊ฒฝ์šฐ์—๋Š” return 1์ด ๋˜๋„๋ก ํ–ˆ๋‹ค.

if(DFS(i,depth+1) ==1) {
	    			return 1;
	    		}

Troubleshooting 3

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		freind = new ArrayList[N];
		for(int i =0; i<N; i++) {
			freind[i] = new ArrayList<>();
		}
		sc.nextLine();
		for(int i =0; i<M; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
		    freind[a].add(b);
		    freind[b].add(a);
		    sc.nextLine();
		}
		visited = new boolean[N];
		for(int i =0; i<N; i++) {
			int answer = DFS(i,1);
			if(answer == 1) {
		    	System.out.println("1");
		        return;
		    }
			for(int j=0; j<N; j++) {
				visited[j] = false;
			}
		}
		System.out.println("0");
		return;
	}
	public static int DFS(int person,int depth){
	    if(depth == 5) {
	    	return 1;
	    }
	    visited[person] = true;
	    for(int i : freind[person]) {
	    	if(!visited[i]) {
	    		if(DFS(i,depth+1) ==1) {
	    			return 1;
	    		}
	        }
	    }
	    return 0;
	}
}

๋ฌธ์ œ

์˜ˆ์ œ๋Š” ๋‹ค ๋งž์•˜๋Š”๋ฐ, ๋ฐฑ์ค€์—์„œ ํ‹€๋ ธ๋‹ค.

์›์ธ

depth5๊นŒ์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ์žฌ๊ท€ํ˜ธ์ถœ(depth == 4)๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋Œ์•„๊ฐˆ ๊ฒฝ์šฐ์—๋Š” depth๋งŒ ์ค„์–ด๋“ค๊ฒŒ์•„๋‹ˆ๋ผ depth๊ฐ€ 4์ธ ์ด์ „ ๋…ธ๋“œ๊ฐ€ false๋กœ ๋ฐ”๋€Œ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡์ง€์•Š์œผ๋ฉด ์ดํ›„๊ฒ€์‚ฌ์—์„œ ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๊ณ„์† ์ œ์™ธ๋˜๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

ํ•ด๊ฒฐ

DFS์—์„œ ๋งˆ์ง€๋ง‰์— return 0ํ•˜๊ธฐ์ „์— ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๋ถˆ๊ฐ€๋Šฅํ• ๊ฒฝ์šฐ, DFS ํ˜ธ์ถœ์‹œ True๋กœ ๋ฐ”๊พธ์—ˆ๋˜ ๋ฐฉ๋ฌธ๋ฐฐ์—ด์˜ ํ•ด๋‹น๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ false๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
visited[person] = false;

์ œ์ถœ์ฝ”๋“œ

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		freind = new ArrayList[N];
		for(int i =0; i<N; i++) {
			freind[i] = new ArrayList<>();
		}
		sc.nextLine();
		for(int i =0; i<M; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
		    freind[a].add(b);
		    freind[b].add(a);
		    sc.nextLine();
		}
		visited = new boolean[N];
		for(int i =0; i<N; i++) {
			int answer = DFS(i,1);
			if(answer == 1) {
		    	System.out.println("1");
		        return;
		    }
			for(int j=0; j<N; j++) {
				visited[j] = false;
			}
		}
		System.out.println("0");
		return;
	}
	public static int DFS(int person,int depth){
	    if(depth == 5) {
	    	return 1;
	    }
	    visited[person] = true;
	    for(int i : freind[person]) {
	    	if(!visited[i]) {
	    		if(DFS(i,depth+1) ==1) {
	    			return 1;
	    		}
	        }
	    }
        visited[person] = false;
	    return 0;
	}
}

์ฝ”๋“œ ์ˆ˜์ •

mainํ•จ์ˆ˜์˜ for๋ฌธ์—์„œ DFS๋ฅผ ์‹คํ–‰ํ•˜๊ณ ๋‚œ ํ›„ visited๋ฅผ false๋กœ ์ดˆ๊ธฐํ™”์‹œ์ผœ์ฃผ๋Š”๋ฐ, ์ด ์ž‘์—…์€ ํ•„์š”์—†๋‹ค.
depth 5๋ฅผ ์ฐ์€ ๋…ธ๋“œ๋Š” True๋กœ ๋‚จ๊ฒ ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋”์ด์ƒ DFS๋ฅผ ํ˜ธ์ถœํ•˜์ง€์•Š๊ธฐ๋•Œ๋ฌธ์— ๊ทธ ๋ถ€๋ถ„์€ ๋ฌธ์ œ๊ฐ€๋˜์ง€์•Š์œผ๋ฉฐ, depth 5๋ฅผ ์ฐ์ง€์•Š์•„์„œ ๋” ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ• ๊ฒฝ์šฐ์—๋Š” DFSํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰์— visited[person] = false;๋ฅผ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ depth5๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ false๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ๋•Œ๋ฌธ์ด๋‹ค.

์ฃผ์˜ํ•  ์‚ฌํ•ญ

  • for๋ฌธ ๋ณ€์ˆ˜ ๊ฐฑ์‹ !
  • ์žฌ๊ท€ํ˜ธ์ถœ์€ ๊ทธ ๊ณผ์ •์—์„œ ๋‹ต์„ ์ฐพ์•˜์„ ๊ฒฝ์šฐ, ๋‹ค์‹œ ์ด์ „์— ํ˜ธ์ถœํ–ˆ๋˜ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๊ทธ ๋•Œ return๊ฐ’์œผ๋กœ ๋‹ต์ด ๊ฐฑ์‹ ๋˜์ง€์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค!!
    -> depth๋ฅผ ๋”ฐ์ ธ์•ผํ•˜๋ฉด ํ˜ธ์ถœํ–ˆ๋˜ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”๋ถ€๋ถ„์„ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•œ๋‹ค.
    depth๋ฅผ ๊ณ ๋ คํ•˜์ง€์•Š๊ณ , ๋ฐฉ๋ฌธ๋ฐฐ์—ด๋งŒ ์ฒดํฌํ•˜๋ฉด ๋Œ์•„๊ฐ€๋Š” ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์ง€์•Š์•„๋„๋œ๋‹ค.

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