[파이썬 코딩테스트] 3.공원 산책 - 프로그래머스

링크

내 풀이(O)

  • 공원을 x,y 좌표를 나타내는 이차원 배열로 만든다
  • 한 칸씩 움직일 때마다 이동하고자 하는 좌표로 이동이 가능한지 체크
def solution(park, routes):
    answer = []
    two_dim_park_arr = []
    two_dim_routes_arr = []

    for p in park:
        two_dim_park_arr.append(list(p))

    answer=[[i,j] for i in range(len(two_dim_park_arr)) for j in range(len(two_dim_park_arr[0])) if two_dim_park_arr[i][j] == 'S'][0]
    print('초기위치:', answer)
    print('=======================')

    for r in routes:
        direction, num = r.split(' ')
        two_dim_routes_arr.append([direction, int(num)])

    for direction, num in two_dim_routes_arr:
        print('시작위치:', answer)
        print('이동 지시:', direction, num)
        result = []
        success = True
        i, j = answer

        while success and num > 0:
            num -= 1

            if (direction == 'N'):
                i -= 1
            elif (direction == 'S'):
                i += 1
            elif (direction == 'E'):
                j += 1
            elif (direction == 'W'):
                j -= 1

            if (i < 0 or j < 0):
                print('공원을 벗어남:', i, j)
                success = False
                break;

            try:
                if two_dim_park_arr[i][j] == 'X':
                    print('장애물:', i, j)
                    success = False
                    break
                else:
                    print('이동 가능', i, j)
                    result = [i, j]
            except:
                print('존재하지 않는 구역:', i, j)
                success = False
                break

        print('이동 가능 여부:', success)    
        if (success):
            print('이동 성공:', result)
            answer = result

        print('=======================')

    print('결과', answer)
    return answer

다른 풀이

  • 클래스를 사용
  • 공원을 x,y 좌표를 나타내는 이차원 배열로 만들 때 for문을 사용하지 않고 간단하게 만듬
  • 목적지까지 이동할 때 지나가는 칸들에 'X'가 있는지 슬라이싱해서 한 번에 체크
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]

검증용 코드

parks = [["SOO","OOO","OOO"], ["SOO","OXX","OOO"], ["OSO","OOO","OXO","OOO"]]
routes = [["E 2","S 2","W 1"], ["E 2","S 2","W 1"], ["E 2","S 3","W 1"]]
results = [[2,1], [0,1], [0,0]]

for idx in range(len(results)):
    print(idx, '성공' if solution(parks[idx], routes[idx]) == results[idx] else "실패")

links

social