본문 바로가기
Problem Solving/프로그래머스

[프로그래머스|파이썬] 공원 산책 (연습문제/level 1)

by 청량리 물냉면 2023. 4. 28.
반응형
문제

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

 

프로그래머스

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

programmers.co.kr

 

 

🐍파이썬
def solution(park, routes):
    answer = [0, 0]
    n = len(park)   #세로
    m = len(park[0])    #가로
    for i in range(n):
        for j in range(m):
            if park[i][j] == "S":	#start에서 시작
                answer[0] = i   #y축
                answer[1] = j   #x축
                break
    for k in routes:
        a, b = k.split()	#a=방향, b=이동한 거리
        b = int(b)
        flag = False	#경로에 X가 있는지 확인하는 플래그
        if a == "E":    #동쪽으로(x축)
            if answer[1]+b >= m:	#인덱스 범위를 넘어선 경우 아래 코드 실행x
                continue
            for i in range(1, b+1):	#한칸씩 이동하며 가는 길에 X가 있는지 확인
                if park[answer[0]][answer[1]+i] == "X":	#x축으로만 이동(y축 고정)
                    flag = True	#경로 상 X가 존재한다
                    break	#종료
            if flag == True:	#경로 상 X가 존재한다면 아래 코드 실행x(이동x)
                continue
            answer[1] += b	#현재 위치 업데이트
        elif a == "W":  #서쪽으로(x축)
            if answer[1]-b < 0:
                continue
            for i in range(1, b+1):
                if park[answer[0]][answer[1]-i] == "X":
                    flag = True
                    break
            if flag == True:
                continue
            answer[1] -= b
        elif a == "S":  #남쪽으로(y축)
            if answer[0]+b >= n:
                continue
            for i in range(1, b+1):
                if park[answer[0]+i][answer[1]] == "X":	#y축으로만 이동(x축 고정)
                    flag = True
                    break
            if flag == True:
                continue
            answer[0] += b
        elif a == "N":  #북쪽으로(y축)
            if answer[0]-b < 0:
                continue
            for i in range(1, b+1):
                if park[answer[0]-i][answer[1]] == "X":
                    flag = True
                    break
            if flag == True:
                continue
            answer[0] -= b
    return answer

동서남북으로 갔을 때 일어나는 일들을 모두 구현해 주었다.

더보기

n칸 뒤가 X이면 이동하지 않는 게 조건인 줄 알았는데 다시 보니 이동 경로에 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]

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

 

반응형