새소식

PS/백준

[백준/13023] ABCDE

  • -

Problem : https://www.acmicpc.net/problem/13023

 

Difficulty : Gold 5

 

Status : Solved

 

Time : ?? : ?? : ??

 


 

문제 설명

 

더보기

BOJ 알고리즘 캠프에는 총 N명이 참가하고 있다. 사람들은 0번부터 N-1번으로 번호가 매겨져 있고, 일부 사람들은 친구이다.

오늘은 다음과 같은 친구 관계를 가진 사람 A, B, C, D, E가 존재하는지 구해보려고 한다.

  • A는 B와 친구다.
  • B는 C와 친구다.
  • C는 D와 친구다.
  • D는 E와 친구다.

위와 같은 친구 관계가 존재하는지 안하는지 구하는 프로그램을 작성하시오.

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 사람의 수 N (5 ≤ N ≤ 2000)과 친구 관계의 수 M (1 ≤ M ≤ 2000)이 주어진다.

둘째 줄부터 M개의 줄에는 정수 a와 b가 주어지며, a와 b가 친구라는 뜻이다. (0 ≤ a, b ≤ N-1, a ≠ b) 같은 친구 관계가 두 번 이상 주어지는 경우는 없다.

 

출력

 

문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.

 

입력 예시

 

5 4 0 1 1 2 2 3 3 4

 

출력 예시

 

1

 

 


 

풀이

 

간단한 dfs + 백트래킹 문제. 이미 방문한 지점을 제외하고 거리가 5가 될때까지 방문을 시행하는 모든 경우를 고려하면 된다. N = 2000, M = 2000인 작은 숫자이므로 가능한 기예라 볼 수 있겠다.

 

풀이 코드 (Python)

import sys input = sys.stdin.readline N, M = map(int, input().split()) friend = [[] for _ in range(N)] for _ in range(M): a, b = map(int, input().split()) friend[a].append(b) friend[b].append(a) visited = [False] * N answer = 0 def dfs(node, depth): if depth == 4: return True for nxt in friend[node]: if not visited[nxt]: visited[nxt] = True if dfs(nxt, depth + 1): return True visited[nxt] = False for i in range(N): if not visited[i]: visited[i] = True if dfs(i, 0) : answer = 1 break visited[i] = False print(answer)

 

풀이 코드 (Go)

package main import ( "bufio" "fmt" "os" ) var ( visited []bool graph [][]int ) func dfs(node, depth int) bool { if depth == 4 { return true } for _, next := range graph[node] { if !visited[next] { visited[next] = true if dfs(next, depth+1) { return true } visited[next] = false } } return false } func main() { var reader *bufio.Reader = bufio.NewReader(os.Stdin) var N, M, a, b int fmt.Fscanln(reader, &N, &M) visited = make([]bool, N) graph = make([][]int, N) for i := 0; i < M; i++ { fmt.Fscanln(reader, &a, &b) graph[a] = append(graph[a], b) graph[b] = append(graph[b], a) } for i := 0; i < N; i++ { visited[i] = true if dfs(i, 0) { fmt.Println(1) return } visited[i] = false } fmt.Println(0) }

 

풀이 완료!

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.