본문 바로가기
공부-코딩테스트/코테풀이 - 자바, 파이썬

게임 맵 최단거리 (코딩테스트, 프로그래머스, 파이썬)

by 령과 2022. 7. 16.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/1844

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


풀이

큐를 사용해서 최단 경로로 도착하는 거리를 측정하였다.

재귀를 쓸 필요없이 queue는 n거리 이동시 도착 가능한 좌표들을 queue배열에 저장,

while문을 한번 할 때마다 queue 좌표들에서 인접한 maps들 중 1이 있는 것들을 queue에 저장한다.

과거의 좌표와 이동할 좌표가 공존하기 때문에 init_q 변수로 이전과 이후를 구분한다.

while문 실행시 과거 좌표까지만 for문을 돌리며 하나씩 좌표를 선택하여 인접에 1이 있으면 모아두고 

한꺼번에 queue에 더하여 추가한다.

while문 마지막에 queue = queue[init_q:]를 하여 과거 좌표를 버린다.

while문 반복 횟수가 정답이 되지만 처음 위치도 1로 취급하기 때문에 answer 초기값을 1로 설정하면 정답이다.


나의 코드

def solution(maps):
    answer = 1
    queue = [[0,0]]
    maps[0][0]=0
    w = len(maps[0])-1
    h = len(maps)-1
    while maps[h][w] == 1:
        init_q = len(queue)
        for i in range(init_q):
            queue += check(queue[i],maps,w,h)
        if len(queue) == init_q:
            return -1
        
        queue = queue[init_q:]
        answer += 1

    return answer

def check(target,maps,w,h):
    tmp = [[-1,0],[1,0],[0,1],[0,-1]]
    tmp_arr = []
    for i in tmp:
        y = i[0]+target[0]
        x = i[1]+target[1]
        if min(x,y)<0 or x>=len(maps[0]) or y>=len(maps):
            continue
        if maps[y][x] == 1:
            maps[y][x] = 0
            tmp_arr.append([y,x])
    return tmp_arr

 

 

댓글