NIRVANA

[level 1] 공원 산책 (파이썬 클래스 복습 필요, 딕셔너리 사용해서 다시 풀어보기) 본문

Coding test(Python3)/Programmers

[level 1] 공원 산책 (파이썬 클래스 복습 필요, 딕셔너리 사용해서 다시 풀어보기)

녜잉 2023. 9. 11. 22:30

문제

지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

  • ["방향 거리", "방향 거리" … ]

예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

  • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
  • 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

 

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

 

문제 풀이 접근법1

1) for 문으로 문자열 s가 있는 위치를 찾은 후, 해당 위치를 answer에 저장한다.

2) routes의 원소로 for문을 반복한다. 원소가 공백을 기준으로 위치와 거리를 저장하고 있으므로 split을 사용하여 공백으로 자른 뒤, 각각의 원소를 way와 distance로 저장한다.

3) 만약 way에 따라서 행 혹은 열을 이동하였을 때, answer[1]이 공원을 벗어나는지 확인한다. 

  • E: 열 + 1
  • W: 열 -1
  • N: 행 - 1
  • S: 행 +1

4) 벗어나지 않는다면 distance만큼 for문을 반복하며 움직여야 하는 행 / 열에 i만큼을 더한다. 만약 이동하는 위치에 X가 있다면 count에 +1을 한다.

5) count가 0이라면 지나가는 길에 장애물이 없는 것이므로 움직인 만큼의 거리를 업데이트한다. 

def solution(park, routes):
    answer = [0, 0]
    height = len(park[0])
    weight = len(park)
    count = 0

    for i in range(len(park)):
        for j in range(len(park[i])):
            if park[i][j] == 'S':
                answer[0] = i
                answer[1] = j

    for i in routes:

        count = 0 

        way, distance = i.split(" ")

        if way == 'E' and answer[1] + int(distance) < height:
            for i in range(1, int(distance)+1):
                if park[answer[0]][answer[1]+i] == 'X':
                     count += 1
            if count == 0:
                answer[1] += int(distance)

        elif way == 'W' and answer[1] - int(distance) >= 0:

            for i in range(1, int(distance)+1):
                if park[answer[0]][answer[1]-i] == 'X':
                     count += 1
            if count == 0:
                answer[1] -= int(distance)

        elif way == 'S' and answer[0] + int(distance) < weight:
            for i in range(1, int(distance)+1):
                if park[answer[0]+i][answer[1]] == 'X':
                     count += 1
            if count == 0:
                answer[0] += int(distance)

        elif way == 'N' and answer[0] - int(distance) >= 0:
            for i in range(1, int(distance)+1):
                if park[answer[0]-i][answer[1]] == 'X':
                     count += 1
            if count == 0:
                answer[0] -= int(distance) 
            
    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]

저 지금 파이썬에도 class가 있다는 걸 알았는데요..

 

딕셔너리를 사용하면 좀 더 깔끔하게 풀 수 있을 것 같다. 

 

https://nirsa.tistory.com/110

 

[Python 3.7] 파이썬 클래스(class)란? (클래스 생성/호출, 인스턴스.메소드 호출, 속성, 인스턴스 속성

파이썬 클래스(class)란? 클래스는 객체를 표현하기 위한 문법으로 체크박스, 스크롤바 같은 특정한 개념이나 모양을 존재하는것을 객체(object)라고 부릅니다. 이렇게 객체를 사용한 프로그래밍

nirsa.tistory.com

 

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[level 2] 최댓값과 최솟값  (0) 2023.09.15
[level 1] 신고 결과 받기  (0) 2023.09.14
[level 1] 달리기 경주  (0) 2023.09.11
[level 1] 개인정보 수집 유효기간  (0) 2023.09.10
[level 1] 바탕화면 정리  (0) 2023.09.09