We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 13023๋ฒˆ: ABCDE - ํŒŒ์ด์ฌ

Redddy 2022. 6. 15. 22:40

๐Ÿ”ˆ ๋ฌธ์ œ

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๋ช…์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. 

๊ทธ๋ฆผ 1

๊ทธ๋ฆผ 1์€ 0์€ ์นœ๊ตฌ 0 -> 1 -> 2 -> 3 -> 4 ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž๋Š” ์นœ๊ตฌ์‚ฌ์ด๋‹ค.

 

๊ทธ๋ฆผ 2

๊ทธ๋ฆผ 2๋„ 2 ๋˜๋Š” 4์—์„œ ์‹œ์ž‘ํ•˜๋ฉด ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž๋Š” ์นœ๊ตฌ์‚ฌ์ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

2 -> 3 -> 0 -> 1 -> 4

4 -> 1 -> 0 -> 3 -> 2

 

๊ทธ๋ฆผ 3

๊ทธ๋ฆผ 3์€ ์–ด๋””์„œ ์‹œ์ž‘ํ•˜์—ฌ๋„ ์นœ๊ตฌ์‚ฌ์ด๊ฐ€ 3๋ช…์ด๊ณ  5๋ช…์ด ๋  ์ˆœ ์—†๋‹ค.

๋•Œ๋ฌธ์— ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž๋Š” ์นœ๊ตฌ์‚ฌ์ด๋Š” ์—†๋‹ค.

 

ํ•ด๋‹น๋ฌธ์ œ๋Š” DFS๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค. ๊นŠ์ด๊ฐ€ 4์ผ๋•Œ ์ •๋‹ต์ด 1์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (๊นŠ์ด๊ฐ€ 4๋ผ๋Š” ๊ฒƒ์€ ๋…ธ๋“œ(์นœ๊ตฌ)๋Š” 5๊ฐœ)

 

๐Ÿ’ป ์ฝ”๋“œ

import sys
sys.setrecursionlimit(10**4)
input = sys.stdin.readline

def dfs(graph, v, visited, cnt):
    global ans
    if cnt == 4: # ๊นŠ์ด๊ฐ€ 4๋ผ๋ฉด ans๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”
        ans = 1
        return 
    for i in graph[v]:
        if not visited[i]:
            visited[i] = True
            dfs(graph, i, visited,cnt+1)
            visited[i] = False # ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•ด๋ณด๊ธฐ ์œ„ํ•ด False ๋กœ (๋ฐฑํŠธ๋ž˜ํ‚น?)

n,m = map(int,input().rstrip().split())
graph = [[] for i in range(n)]
ans = 0
# ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
for _ in range(m):
    a,b= map(int,input().rstrip().split())
    graph[a].append(b)
    graph[b].append(a)

# ์—ฐ๊ฒฐ ๊ฐ„์„ ์ด 4 ์ด์ƒ์ผ ๋•Œ๋งŒ ํ•ด๋‹น ๋ฌธ์ œ์˜ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค.
if m >= 4:
    for node in range(n):
        visited = [False] * n
        visited[node] = True # ์‹œ์ž‘ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        dfs(graph, node, visited, 0) # DFS ์‹œ์ž‘
        if ans == 1: # ๊นŠ์ด๊ฐ€ 4์ธ๊ฒŒ ์žˆ๋‹ค๋ฉด ๋ฉˆ์ถค
            break
print(ans)

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

์ธ๊ฐ„์Šน๋ฆฌ

๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” sys.setrecursionlimit์„ ํ•˜์ง€ ๋ชปํ•ด์„œ ๊ทธ๋žฌ๋‹ค ์น˜๊ณ , ์ฒซ๋ฒˆ์งธ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค์˜ ์ด์œ ๋Š” ๋ฐ”๋กœvisited[i] = False๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

ํ•œ๋ฒˆ ๋ฐฉ๋ฌธ ํ–ˆ๋˜ ๊ณณ์€ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ๊ฒŒ ๋งž์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ๋„ ๊ฐ€๋ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ False๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€ ๊ฒƒ์ด๋‹ค. n๊ณผ m ์‹œ๋ฆฌ์ฆˆ์—์„œ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ํ•œ ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ False ๋ฅผ ์ฃผ์—ˆ๋”๋‹ˆ ์ด์ œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค..ใ…Ž

๋‹ค์‹œ ๋ฉ˜๋ถ•์ด ์™”์ง€๋งŒ ๋ง˜์„ ๋‹ค ์žก๊ณ  pypy๋กœ ์ œ์ถœํ•˜์˜€์ง€๋งŒ ๊ทธ๋ž˜๋„ ๊ฒฐ๊ณผ๋Š” ๋ณ€ํ•จ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜์ค‘์— ๋‹ค์‹œ ํ•ด๋ณผ๊นŒํ•˜๋‹ค๊ฐ€ DFS ํ•จ์ˆ˜ ๊ตฌํ˜„ ๋ถ€๋ถ„์—์„œ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค. 

if cnt == 4 ์ด๋ถ€๋ถ„์ธ๋ฐ, ๋‚˜์˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋‚ฌ๋˜ ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ์ •๋‹ต์ด 1๋กœ ํŒ๋ณ„ ๋‚˜๋„ ๊ณ„์† ๋๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•˜๋Š” ํ˜•ํƒœ์˜€๋‹ค. ๊ทธ๋ž˜์„œ cnt ==4 ๋ผ๋ฉด ans ์ดˆ๊ธฐํ™” ํ•ด์ค€๋’ค return ํ•˜์˜€๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค!!!ใ…Žใ…Ž

 

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ABCDE