😊 λ°±μ€€ 2468 : μ•ˆμ „ μ˜μ—­

3JuhwanΒ·2021λ…„ 2μ›” 24일
0

Algorithm

λͺ©λ‘ 보기
9/23

2468: μ•ˆμ „ μ˜μ—­

DFS/BFS μ—¬μ„― 번째 문제!


πŸ“Œ Try 1

def dfs(x, y):
    if x < 0 or x >= N or y < 0 or y >= N:
        return 0
        
    if visit[x][y] == 0 and graph[x][y] > i:
        visit[x][y] = 1
        
        dfs(x+1, y)
        dfs(x-1, y)
        dfs(x, y+1)
        dfs(x, y-1)
        return 1

    return 0

N = int(input())
graph, Hindex, result = list(), set(), list()

for _ in range(N):
    _input = list(map(int, input().split()))
    Hindex.update(_input)
    graph.append(_input)
    
for i in Hindex:
    visit, num = [[0 for _ in range(N)] for _ in range(N)], 0
    
    for x in range(N):
        for y in range(N):
            if visit[x][y] == 0 and graph[x][y] > i:
                num += dfs(x, y)
    result.append(num)
    
print(max(result))

μ‹œκ°„ μ œν•œμ΄ 1초이기 λ•Œλ¬Έμ— μž…λ ₯된 μ§€ν˜• 높이λ₯Ό 쀑볡 없이 μ €μž₯ν•˜κ³  μ €μž₯된 λ†’μ΄λ§Œ νƒμƒ‰ν•˜λ € ν–ˆλ‹€. HindexλΌλŠ” setλ₯Ό λ§Œλ“€κ³  μ €μž₯ν–ˆλ‹€.
이 뢀뢄이 λ¬Έμ œμ˜€λ‹€. μ•ˆ μž κΈ°λŠ” κ²½μš°κ°€ μžˆλ‹€λŠ” κ±Έ κ³ λ €ν•˜μ§€ μ•Šμ€ κ±°λ‹€.

μœ„ μ½”λ“œλŠ” λŸ°νƒ€μž„ μ—λŸ¬ (RecursionError)κ°€ λ–΄λ‹€.
pythonμ—μ„œ μž¬κ·€ depthλŠ” 3000인데 이걸 κ³ λ €ν•˜μ§€ λͺ»ν–ˆλ‹€.
N <= 100 μ΄λ―€λ‘œ depthλŠ” 10000을 훨씬 λ„˜λŠ”λ‹€.


πŸ“Œ Try 2

def dfs(x, y):
    if x < 0 or x >= N or y < 0 or y >= N:
        return 0
        
    if visit[x][y] == 0 and graph[x][y] > i:
        visit[x][y] = 1
        
        dfs(x+1, y)
        dfs(x-1, y)
        dfs(x, y+1)
        dfs(x, y-1)
        return 1

    return 0

N = int(input())
graph, result = list(), list()

for _ in range(N):
    _input = list(map(int, input().split()))
    graph.append(_input)
    
for i in range(2, 101):
    visit, num = [[0 for _ in range(N)] for _ in range(N)], 0
    
    for x in range(N):
        for y in range(N):
            if visit[x][y] == 0 and graph[x][y] > i:
                num += dfs(x, y)
    result.append(num)
    
print(max(result))

μœ„ μ½”λ“œλŠ” λ‹¨μˆœνžˆ Hindex만 μ‚­μ œν•œ μ½”λ“œμ΄λ‹€.
이 μ½”λ“œλ„ λ¬Έμ œκ°€ μžˆλŠ”λ°, for의 λ²”μœ„κ°€ (2,101)이닀. 0λΆ€ν„° 탐색해야 ν•˜λŠ”λ°,,,


πŸ“Œ Try 3

import sys
sys.setrecursionlimit(100000)

def dfs(x, y):
    if x < 0 or x >= N or y < 0 or y >= N:
        return 0
        
    if visit[x][y] == 0 and graph[x][y] > i:
        visit[x][y] = 1
        
        dfs(x+1, y)
        dfs(x-1, y)
        dfs(x, y+1)
        dfs(x, y-1)
        
        return 1

    return 0

N = int(input())
graph, result = list(), list()

for _ in range(N):
    _input = list(map(int, input().split()))
    graph.append(_input)
    
for i in range(0, 101):
    visit, num = [[0 for _ in range(N)] for _ in range(N)], 0
    
    for x in range(N):
        for y in range(N):
            if visit[x][y] == 0 and graph[x][y] > i:
                num += dfs(x, y)
    result.append(num)
print(max(result))

맨 μœ„μ˜ sys.setrecursionlimit(100000)λŠ” μž¬κ·€ depthλ₯Ό μž„μ˜λ‘œ λŠ˜λ €μ€€ 것이닀.

for의 λ²”μœ„ μ—­μ‹œ (0, 101)둜 μˆ˜μ •ν–ˆλ‹€.

κ²°κ³ΌλŠ”,,, λ§žμ•˜μŠ΅λ‹ˆλ‹€!!

.
.
.

μ•žμœΌλ‘œ λ²”μœ„λ₯Ό κ³ λ €ν•΄μ„œ dfsλ₯Ό μ¨μ•Όκ² μŠ΅λ‹ˆλ‹€.πŸ˜‚

λ²”μœ„κ°€ 크면, dfsλ₯Ό for둜 κ΅¬ν˜„ν•˜κ±°λ‚˜, bfsλ₯Ό μ‚¬μš©ν•΄μ•Όκ² μŠ΅λ‹ˆλ‹€.


🎁 Reference

profile
Codeforces와 USACO 풀이λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€. 이전 글도 계속 μ—…λ°μ΄νŠΈ λ©λ‹ˆλ‹€.

0개의 λŒ“κΈ€