728x90
λ°˜μ‘ν˜•

λ¬Έμ œπŸ€”

NxN 크기의 λ―Έλ‘œμ—μ„œ μΆœλ°œμ§€μ—μ„œ λͺ©μ μ§€μ— λ„μ°©ν•˜λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 도착할 수 있으면 1, μ•„λ‹ˆλ©΄ 0을 좜λ ₯ν•œλ‹€.

주어진 미둜 λ°–μœΌλ‘œλŠ” λ‚˜κ°ˆ 수 μ—†λ‹€.

λ‹€μŒμ€ 5x5 미둜의 μ˜ˆμ΄λ‹€.
 

13101

10101

10101

10101

10021

 

λ§ˆμ§€λ§‰ μ€„μ˜ 2μ—μ„œ μΆœλ°œν•΄μ„œ 0인 ν†΅λ‘œλ₯Ό 따라 μ΄λ™ν•˜λ©΄ 맨 μœ—μ€„μ˜ 3에 도착할 수 μžˆλŠ”μ§€ ν™•μΈν•˜λ©΄ λœλ‹€.

 
 

[μž…λ ₯]
 

첫 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 개수 Tκ°€ 주어진닀.  1<=T<=50
 

λ‹€μŒ 쀄뢀터 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ λ³„λ‘œ 미둜의 크기 Nκ³Ό N개의 쀄에 걸쳐 미둜의 ν†΅λ‘œμ™€ 벽에 λŒ€ν•œ 정보가 주어진닀. 0은 ν†΅λ‘œ, 1은 λ²½, 2λŠ” 좜발, 3은 도착이닀. 5<=N<=100

 

[좜λ ₯]
 

각 μ€„λ§ˆλ‹€ "#T" (TλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 번호)λ₯Ό 좜λ ₯ν•œ λ’€, κ³„μ‚°κ²°κ³Όλ₯Ό μ •μˆ˜λ‘œ 좜λ ₯ν•˜κ±°λ‚˜ λ˜λŠ” ‘error’λ₯Ό 좜λ ₯ν•œλ‹€.

 

λ‚΄ ν’€πŸ¦·

# 4875. 미둜
# μΆœλ°œμ§€μ—μ„œ λͺ©μ μ§€μ— λ„μ°©ν•˜λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ 확인
# λ§ˆμ§€λ§‰ μ€„μ˜ 2μ—μ„œ 좜발, 0인 ν†΅λ‘œλ₯Ό 따라 μ΄λ™ν•˜λ©΄ 맨 μœ—μ€„μ˜ 3에 λ„μ°©ν•˜λŠ”μ§€
# 사방 탐색
dx = [0, 1, 0, -1] # λ²”μœ„ μ œλŒ€λ‘œ 확인
dy = [-1, 0, 1, 0]
def miro(i, j):
    global result # κ²°κ³Όκ°’ μ „μ—­λ³€μˆ˜λ‘œ μ„€μ •ν•΄μ£ΌκΈ°
    visited[i][j] = True
    for k in range(4):
        di = i + dx[k]
        dj = j + dy[k] # ν•˜λ‚˜ν•˜λ‚˜ μ‹ κ²½μ¨μ„œ 적기
        if 0 <= di < N and 0 <= dj < N and not visited[di][dj]:
            # νƒμƒ‰μ•ˆν–ˆκ³  0이면 μž¬κ·€
            if arr[di][dj] == 0:
                miro(di, dj)
            # 3 λ„μ°©ν•˜λ©΄ 성곡
            elif arr[di][dj] == 3:
                result = 1 # κ²°κ³Όκ°’ μ„±κ³΅μœΌλ‘œ λ°”κΎΈκΈ°
                break

T = int(input())
for tc in range(1, T + 1):
    N = int(input()) # 미둜의 크기
    arr = [list(map(int, input().strip())) for _ in range(N)]
    # λ°©λ¬Έ 검사
    visited = [[False for _ in range(N)] for _ in range(N)]
    result = 0 # κ²°κ³Όκ°’

    for i in range(N-1, -1, -1):
        for j in range(N-1, -1, -1):
            if arr[i][j] == 2:
                miro(i, j) # ν•¨μˆ˜μ— μ‹œμž‘μ  λ„£μ–΄μ£ΌκΈ°

    print(f'#{tc} {result}')

벽이 μ—†λŠ”κ³³μ„ ν”Όν•΄μ„œ κ°€μ•Όν•œλ‹€κ³ λΌκ³ λΌκ³ λΌνŒŒλ• 혼자 이러고 μžˆλ‹€κ°€..

λ­”κ°€ 였늘 μ‹œν—˜μ—μ„œ μ‚¬μš©ν•œ(?) 델타 + dfsμ—μ„œ 배운 κ°œλ…λ“€ + μž¬κ·€ λ‹€ μ“°λ©΄ ν•΄κ²°ν•  λ“―(?)으둜 μƒκ°ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€μ•„ πŸ€”

 


쀑간에 μ‹€μˆ˜ν•œ λΆ€λΆ„λ“€ 😡‍πŸ’«

- 델타 λ²”μœ„ (취쀑 μ½”λ”©ν•΄μ„œ κ·ΈλŸ°κ°€ 잘λͺ» 적음;;;;

- dj = i + dk[k] (μ—­μ‹œ 잘λͺ» 적음....)

- μž…λ ₯ 받을 λ•Œ strip() 써주지 μ•Šμ•„μ„œ λŸ°νƒ€μž„μ—λŸ¬ λ°œμƒ.... => 사싀 아직도 잘 λͺ¨λ₯΄κ² μŒ μ™œμΈμ§€...

strip()은 곡백을 μ œκ±°ν•˜λ©΄ λ˜λŠ”κ±°μžλ‚˜μš”??

split()을 μ•ˆ 적어주면 λœλ‹€ μ•„λ‹Œκ°€μš”??

μ•„μ‹œλŠ” λ©‹μ§„λΆ„μ˜ λŒ“κΈ€ 기닀리고 μžˆκ² μŠ΅λ‹ˆλ‹€...

 

참고함면 쒋을 κ°œλ…λ“€ ✍️

1) 델타λ₯Ό μ΄μš©ν•œ 2μ°¨ λ°°μ—΄ 탐색

: 2μ°¨ λ°°μ—΄μ˜ ν•œ μ’Œν‘œμ—μ„œ 4λ°©ν–₯의 인접 λ°°μ—΄ μš”μ†Œλ₯Ό νƒμƒ‰ν•˜λŠ” 방법(8방도 κ°€λŠ₯)

arr[0...N-1][0...N-1] # N * N λ°°μ—΄
di = [0, 1, 0, -1] # ν•˜, 우, 상, 쒌
dj = [1, 0, -1, 0]
for i in range(N):
	for j in range(N): # μ—¬κΈ°κΉŒμ§€λŠ” μš°λ¦¬κ°€ ν”νžˆμ•„λŠ” 이차원 λ°°μ—΄
    	for k in range(4): # 델차λ₯Ό 이용
        	ni = i + di[k]
            nj = j + dj[k]
            if 0 <= ni < N and 0 <= nj < N: # λ²”μœ„μ— μ•ˆμ— λ“€μ–΄μžˆλŠ” 인덱슀면...
            	f(arr[ni][nj]) # 이 점을 κΈ°μ€€μœΌλ‘œ 더해주든 개수λ₯Ό μ„Έμ£Όλ˜ 더 λ‚˜μ•„κ°€λ˜ λ¬΄κΆλ¬΄μ§„ν•œ λ¬Έμ œλ“€μ΄ λ‚˜μ˜¬ 수 μžˆλ‹€

 

2) μž¬κ·€λ₯Ό ν™œμš©ν•œ dfs

μž¬κ·€λ₯Ό ν™œμš©ν•¨μœΌλ‘œμ¨ μ‰½κ²Œ dfsλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€(λ‚΄μš©μ€ μ•ˆμ‰¬μ›€... μ΄ν•΄ν•˜κΈ° νž˜λ“€μ—ˆμŒ..)

def dfs(v):
    global visited
    # print(v, "-", end='')
    visited[v] = True # 이거에 ν•΄λ‹Ήν•˜λ©΄ 진행
    # v λ…Έλ“œμ—μ„œ 갈 수 μžˆλŠ” λ…Έλ“œλ₯Ό 확인 (μΈμ ‘ν•œ λ…Έλ“œ)
    for u in graphs[v]:
        if visited[u] == True:  # 방문을 ν–ˆλ‹€λ©΄
            continue
        # 방문을 ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ 방문을 진행
        else: # uκ°€ visitedμ•ˆμ— λ“€μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ uλ₯Ό λ‹€μ‹œ dfs ν•΄μ£Όλ©΄ λœλ‹€
            dfs(u)  # λͺ¨λ“  μš”μ†Œκ°€ λ‹€ λŒμ•„κ°€μ„œ λͺ¨λ“  μš”μ†Œκ°€ 트루둜 λ°”λ€Œλ©΄ λλ‚œλ‹€.

 

 

728x90
λ°˜μ‘ν˜•

+ Recent posts