본문 바로가기
알고리즘/프로그래머스

리코쳇 로봇

by 1.5볼트 2023. 4. 12.
728x90

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

 

프로그래머스

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

programmers.co.kr

 

 

생각보다 어렵다
일단 이것도 2차원 형태로 길을 찾는 문제다 그러면 bfs 사용
아마도 dfs 보다 bfs 가 빠를 듯 n 번째에 출구를 찾으면 바로 끝나기 때문에?
어쨌든 bfs를 사용하는데 약간 방식이 애매하다 한 칸이 아니라 끝까지 미끄러지기 때문에
처음 시작점에서 시작해서 사방으로 가는데 1칸이 아니라 벽을 만나거나 모서리까지 갈 때까지 while 문으로 반복한다
만약 while 문을 탈출한다는 건 벽이기 때문에 그 점이 도착점이다
한번 방문한 곳을 재방문 하면 무한 루프가 생기기 때문에 딕셔너리를 사용해 지나온 곳은 체크한다
이런 식으로 시작점에서 사방 끝으로 그리고 도착한 곳 모두에서 다시 각각 사방 끝으로 가는 걸 반볻하다가 탈출구를 만나면 지금까지
반복한 횟수를 리턴
끝날 때까지 리턴하지 않는다면 길이 없다는 뜻이므로 -1 리턴

 

def solution(t):
    r=len(t)
    l=len(t[0])
    a=0
    t1=[]
    for i in range(r):
        for j in range(l):
            if t[i][j]=="R":
                t1.append([i,j])
            if t[i][j]=="G":
                tx,ty=i,j
    t2=[] 
    d={}
    n=1
    while t1:
        t2=[]
        for i,j in t1:
            for x,y in [[1,0],[-1,0],[0,1],[0,-1]]:
                x1=x
                y1=y
                while 0<=i+x1<r and  0<=j+y1<l and t[i+x1][j+y1]!="D":
                    x1+=x
                    y1+=y
                if (i+x1-x,j+y1-y)==(tx,ty):
                    return n
                d.setdefault((i+x1-x,j+y1-y),1)
                if d[(i+x1-x,j+y1-y)]:
                    d[(i+x1-x,j+y1-y)]=0
                    t2.append((i+x1-x,j+y1-y))
                #print(i+x1-x,j+y1-y)
        n+=1
        t1=t2
    return -1

'알고리즘 > 프로그래머스' 카테고리의 다른 글

구명보트 python  (0) 2023.04.14
연속 부분 수열 합의 개수 python  (0) 2023.04.13
연속된 부분 수열의 합  (0) 2023.04.08
N개의 최소공배수  (0) 2023.04.05
과제 진행하기  (0) 2023.04.03

댓글