RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스 > Lv2] 리코챗 로봇

2023. 3. 22. 13:15
728x90
반응형
 

프로그래머스

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

programmers.co.kr

 

1. 문제

[입력]

게임판의 상태를 나타내는 문자열 배열 board

  • . : 빈공간
  • D : 장애물
  • R : 로봇의 처음 위치
  • G : 목표 지점

[결과]

말이 목표위치에 도달하는데 최소 몇 번 이동해야 하는지 return

 

2. 풀이

🌹 BFS를 이용하면 풀 수 있는 문제입니다. :-)

먼저 탐색의 시작점과 target 지점을 찾아두어야 합니다.

startX, startY = 0, 0
targetX, targetY = 0, 0
width, height = len(board[0]), len(board)
for x in range(height):
    for y in range(width):
        if board[x][y]=='R': startX,startY = x,y
        elif board[x][y]=='G': targetX,targetY = x,y

 

게임판 위의 장애물이나 맨 끝에 부딪힐 때까지 미끄러져 이동한다는 점을 보면,

중복되는 이동경로가 있을 수 있다는 것을 알 수 있습니다.

위의 이미지에서 처럼 A 지점에서 오른쪽으로 이동하는 것과 B 지점에서 오른쪽으로 이동하는 경우의 도착지점이 동일하기 때문에

🌹 특정 지점 P에서 D 방향으로 이동할 때 지나가는 지점은 다시 D 방향으로 탐색할 필요가 없습니다.

이를 위해 visited라는 배열을 추가해줍니다. 🤗

visited = [[[False]*4 for _ in range(width)] for _ in range(height)]

이후는 BFS 알고리즘을 사용하여 탐색하시면 됩니다.

 

3. 코드

Python
dx = [-1,0,1,0]
dy = [0,1,0,-1]
def solution(board):
    startX, startY = 0, 0
    targetX, targetY = 0, 0
    width, height = len(board[0]), len(board)
    for x in range(height):
        for y in range(width):
            if board[x][y]=='R': startX,startY = x,y
            elif board[x][y]=='G': targetX,targetY = x,y
    
    q = [(startX,startY,0)]
    visited = [[[False]*4 for _ in range(width)] for _ in range(height)]
    while q:
        x, y, time = q.pop(0)
        
        if x == targetX and y == targetY:
            return time
        
        for d in range(4):
            if not visited[x][y][d]:
                visited[x][y][d] = True
                nx, ny = x+dx[d], y+dy[d]
                while 0<=nx<height and 0<=ny<width and board[nx][ny]!='D':
                    visited[nx][ny][d] = True
                    nx, ny = nx+dx[d], ny+dy[d]
                q.append((nx-dx[d],ny-dy[d],time+1))
                
    return -1
반응형

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

[프로그래머스>LV1] 공원산책(Python)  (0) 2023.03.31
[프로그래머스 > Lv2] 광물캐기  (0) 2023.03.27
[프로그래머스 > Lv4] 지형이동  (0) 2023.03.16
[프로그래머스 > Lv4] 가사 검색  (0) 2023.03.14
[프로그래머스 > Lv4] 행렬과 연산  (0) 2023.03.12
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스>LV1] 공원산책(Python)
    • [프로그래머스 > Lv2] 광물캐기
    • [프로그래머스 > Lv4] 지형이동
    • [프로그래머스 > Lv4] 가사 검색
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바