알고리즘/SWEA

[Python] SWEA 1226: 미로1

suwonieee 2023. 2. 21. 17:43

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14vXUqAGMCFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제는 무난한 bfs 연습문제였다.

 

1차 시도

더보기
from collections import deque
import sys
input = sys.stdin.readline

dr = [0,0,-1,1]
dc = [1,-1,0,0]

def bfs(row, col):
    visit = [[0 for _ in range(17)] for _ in range(17)]
    q = deque()
    q.append((row, col))
    visit[row][col] = 1
    while q:
        vr, vc = q.popleft()
        for k in range(4):
            newr = vr + dr[k]
            newc = vc + dc[k]
            if 0<= newr<16 and 0<=newc<16 and maze[newr][newc] == 0:
                if visit[newr][newc] == 0:
                    q.append((newr,newc))
                    visit[newr][newc] = visit[vr][vc] + 1
            elif 0<=newr<16 and 0<=newc<16 and maze[newr][newc] == 3: #도착한 경우
                print(f'#{tc} 1')
                return
    print(f'{tc} 0')

T = 10

for tc in range(1,T+1):
    n = input()
    maze = [list(map(int,input())) for _ in range(16)]
    print(maze)
    for row in range(16):
        for col in range(16):
            if maze[row][col] == 2:
                bfs(row,col)

input을 받는 과정에서 문제가 있었다. input = sys.stdin.readline를 사용하는 바람에 TC의 줄바꿈 개행 문자가(\n) 같이 데이터에 딸려 들어간 것. 당연히 map에서 \n을 int처리할 수 없다는 오류를 내보냈다.map 함수를 사용하지 않고 input을 str로 받으면 16개의 data를 리스트 처리하는 것이 아니라 '\n'까지 데이터로 봐서 처리하고, 답이 잘 나오지 않게 된다. 교수님에게 여쭤본 후 readline이 개행문자까지 처리하는 것을 알게 되었고... strip() 처리를 해야 한다는 것을 알게 되었다.

 

ANS

from collections import deque

dr = [0,0,-1,1]
dc = [1,-1,0,0]

def bfs(row, col):
    visit = [[0 for _ in range(17)] for _ in range(17)]
    q = deque()
    q.append((row, col))
    visit[row][col] = 1
    while q:
        vr, vc = q.popleft()
        for k in range(4):
            newr = vr + dr[k]
            newc = vc + dc[k]
            if 0<= newr<16 and 0<=newc<16 and maze[newr][newc] == 0:
                if visit[newr][newc] == 0:
                    q.append((newr,newc))
                    visit[newr][newc] = visit[vr][vc] + 1
            elif 0<=newr<16 and 0<=newc<16 and maze[newr][newc] == 3: #도착한 경우
                print(f'#{tc} 1')
                return
    print(f'#{tc} 0')

T = 10

for tc in range(1,T+1):
    n = input()
    maze = [list(map(int,input())) for _ in range(16)]
    print(maze)
    for row in range(16):
        for col in range(16):
            if maze[row][col] == 2:
                bfs(row,col)

 

더보기

그냥 백준 풀 때나 readline 쓰고 SWEA 풀 때는 readline 사용하지 말자.............. 안 쓰니까 너무나도 깔끔하고 예쁘게 답 나온다...

 

굳이 쓰고 싶으면 이렇게 쓰자! n이 strip 받지 않도록 하기...

from collections import deque
import sys
input = sys.stdin.readline

dr = [0,0,-1,1]
dc = [1,-1,0,0]

def bfs(row, col):
    visit = [[0 for _ in range(17)] for _ in range(17)]
    q = deque()
    q.append((row, col))
    visit[row][col] = 1
    while q:
        vr, vc = q.popleft()
        for k in range(4):
            newr = vr + dr[k]
            newc = vc + dc[k]
            if 0<= newr<16 and 0<=newc<16 and maze[newr][newc] == 0:
                if visit[newr][newc] == 0:
                    q.append((newr,newc))
                    visit[newr][newc] = visit[vr][vc] + 1
            elif 0<=newr<16 and 0<=newc<16 and maze[newr][newc] == 3: #도착한 경우
                print(f'#{tc} 1')
                return
    print(f'#{tc} 0')

T = 10

for tc in range(1,T+1):
    n = input()
    maze = [list(map(int,input().strip())) for _ in range(16)]
    for row in range(16):
        for col in range(16):
            if maze[row][col] == 2:
                bfs(row,col)