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

프로그래머스 Lv1 공원 산책 (python)

by 개발하는 호랑이 2024. 2. 12.

공원 산책

 

 

풀이

문제가 길긴 했지만 몇 가지만 주의 하면 되는 문제이다.
결국은 if else문을 잘 쓸줄 아느냐 행렬을 사용할 줄 아느냐에 대한 문제이다.

  1. 각 기본 사항에 대해서 입력
  2. 시작 위치를 설정
  3. 시작 위치를 기반으로 행렬작동
  4. 행렬 작동간 로봇 강아지가 입력 거부 안하고 진행할 경우에만 로봇 강아지의 위치 조정
  5. 마지막 위치 반환
# 지나다니는 길을 'O', 장애물을 'X'로 나타낸 공원
# 로봇 강아지의 산책
# 입력 중에서 E 5 로 주어졌을 때, 이동 중 장애물을 만나거나 공원을 벗어난다면 이번 입력 수행 안함.
def solution(park, routes):
    answer = 'NSWE'
    H = len(park)
    W = len(park[0])
    d_dic = {"N":0,"S":1,"W":2,"E":3}
    # 상하좌우
    dr = [-1,1,0,0]
    dc = [0,0,-1,1]
    
    find_s = False
    # 시작지점, cr, cs 구하기
    for r in range(H):
        for c in range(W):
            if park[r][c] == 'S':
                cr = r
                cc = c
                find_s = True
                break
        if find_s:
            break
    
    # 최종 위치 찾기
    for i in range(len(routes)):
        tmp = list(map(str, routes[i].split()))
        # 방향
        dt = d_dic[tmp[0]]
        # 거리
        ds = int(tmp[1])
        # 로봇 강아지가 제대로 임무 수행 할 수 있는 경우만 찾기
        # 로봇 강아지가 공원안에 있을 수 있는지 확인
        if (0 <= cr + (dr[dt]*ds) < H  and 0 <= cc + (dc[dt]*ds) < W):
            # 로봇 강아지가 장애물을 마주치는 지 확인
            for j in range(1, ds+1):
                if park[cr+(dr[dt]*j)][cc + (dc[dt]*j)] == 'X':
                    break
            else:
                cr = cr + (dr[dt]*ds)
                cc = cc + (dc[dt]*ds)
        print(cr, cc)
        
    return [cr, cc]

다른 사람 풀이

나와는 다르게 애초에 dx, dy라는 딕셔너리 변수로 미리 방향에 따른 값을 적용시켜놨다.
그 이후는 비슷하다고 봐도 무방하겠다.

dx = {'N':-1, 'S':1, 'E':0, 'W': 0}
dy = {'N': 0, 'S':0, 'E':1, 'W':-1}

def solution(park, routes):
    answer = []
    x, y = -1, -1
    N, M = len(park), len(park[0])
    for i in range(N):
        for j in range(M):
            if park[i][j] == 'S':
                x, y = i, j

    for route in routes:
        dir_, dist = route.split(' ')

        isFalse = False
        for i in range(1, int(dist) + 1):
            nx, ny = x + dx[dir_] * i, y + dy[dir_] * i
            if nx < 0 or ny < 0 or nx > N-1 or ny > M-1:
                isFalse = True
                break
            if park[nx][ny] == 'X':
                isFalse = True
                break

        if isFalse:
            continue
        nx, ny = x + dx[dir_] * int(dist), y + dy[dir_] * int(dist)
        x, y = nx, ny

    answer = [x, y]

    return answer

클래스를 이용해서 푼 사람이다... 허허.... 아직도 난 멀었다.

class Dog:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.g = {"N": (-1, 0), "W": (0, -1), "E": (0, 1), "S": (1, 0)}

    def move(self, park, direction, distance):
        i, j = self.g[direction]
        x, y = self.x + (i * distance), self.y + (j * distance)
        if x < 0 or y < 0 or x >= len(park) or y >= len(park[0]):
            return park
        elif "X" in park[x][min(self.y, y) : max(self.y, y) + 1] or "X" in [
            row[y] for row in park[min(self.x, x) : max(self.x, x)]
        ]:
            return park
        park[self.x][self.y] = "O"
        park[x][y] = "S"
        self.x = x
        self.y = y
        return park

    @classmethod
    def detect_start_dogs_location(self, park):
        for i, row in enumerate(park):
            for j, item in enumerate(row):
                if item == "S":
                    return i, j


def solution(park, routes):
    park = [list(row) for row in park]
    x, y = Dog.detect_start_dogs_location(park)

    dog = Dog(x, y)

    for route in routes:
        direction, distance = route.split()
        park = dog.move(park, direction, int(distance))

    return [dog.x, dog.y]