본문 바로가기
✅ 문제풀이

프로그래머스 - 공원산책 파이썬 python

by dogfoot.dev 2023. 10. 3.
728x90
728x90

프로그래머스 Level 1 공원산책 파이썬 문제 풀이 입니다.

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/172928?language=python3 

 

프로그래머스

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

programmers.co.kr

 

 

✅ Python3 답안 입니다 더보기 클릭!

 

더보기

def vaild_check(cur, after, park, d):
    total_x = len(park[0])
    total_y = len(park)
    if after[0] < 0 or after[0] >= total_y or 0 > after[1] or after[1] >= total_x:
        return False
    elif d == 'E':
        road = park[cur[0]]
        if 'X' in road[cur[1]: after[1]+1]:
            return False
    elif d == 'W':
        road = park[cur[0]]
        if 'X' in road[after[1]: cur[1]+1]:
            return False
    elif d == 'S':
        road = []
        for p in park:
            road.append(p[cur[1]])
        if 'X' in road[cur[0]: after[0]+1]:
            return False
    elif d == 'N':
        road = []
        for p in park:
            road.append(p[cur[1]])
        if 'X' in road[after[0]: cur[0]+1]:
            return False
    return True
    
def solution(park, routes):
    answer = []
    cur = [0,0]
    for i,p in enumerate(park):
        for j,x in enumerate(p):
            if x == 'S':
                cur = [i,j]
    for i,r in enumerate(routes):
        if r[0] == 'E':
            after = [cur[0], cur[1]+ int(r[2])]
        if r[0] == 'W':
            after = [cur[0], cur[1]- int(r[2])]
        if r[0] == 'S':
            after = [cur[0]+ int(r[2]), cur[1]]
        if r[0] == 'N':
            after = [cur[0]- int(r[2]), cur[1]]
        vaild = vaild_check(cur, after, park, r[0])
        if vaild:
            cur = after
            
            
    answer = cur
    return answer

 

📌 해설

빡구현으로 풀었습니다. 다른 사람의 풀이를 확인해보니 자료구조를 적절히 활용해 보는것도 좋을 듯합니다. 

def solution(park, routes):
    answer = []
    cur = [0,0]
    for i,p in enumerate(park):
        for j,x in enumerate(p):
            if x == 'S':
                cur = [i,j]
    for i,r in enumerate(routes):
        if r[0] == 'E':
            after = [cur[0], cur[1]+ int(r[2])]
        if r[0] == 'W':
            after = [cur[0], cur[1]- int(r[2])]
        if r[0] == 'S':
            after = [cur[0]+ int(r[2]), cur[1]]
        if r[0] == 'N':
            after = [cur[0]- int(r[2]), cur[1]]
        if vaild_check(cur, after, park, r[0]):
            cur = after
    answer = cur
    return answer

1. 'S' 스타트 지점을 찾아 cur 에 담습니다. 

2. routes 를 순회하면서 after 을 만들고 vaild_check 에 필요한 값들을 넘겨 매번 이동할때마다 체크를 합니다.

3. 체크해서 True 일때만 이동시킵니다. cur = after

3. 답을 반환합니다.

 

def vaild_check(cur, after, park, d):
    total_x = len(park[0])
    total_y = len(park)
    if after[0] < 0 or after[0] >= total_y or 0 > after[1] or after[1] >= total_x:
        return False
    elif d == 'E':
        road = park[cur[0]]
        if 'X' in road[cur[1]: after[1]+1]:
            return False
    elif d == 'W':
        road = park[cur[0]]
        if 'X' in road[after[1]: cur[1]+1]:
            return False
    elif d == 'S':
        road = []
        for p in park:
            road.append(p[cur[1]])
        if 'X' in road[cur[0]: after[0]+1]:
            return False
    elif d == 'N':
        road = []
        for p in park:
            road.append(p[cur[1]])
        if 'X' in road[after[0]: cur[0]+1]:
            return False
    return True

체크 로직입니다. 매우 단순합니다. 

1. after 이 먼저 공원 밖을 나가는지 검사합니다. 밖으로 나가면 False를 반환하고 체크 함수를 종료합니다.

2. 각 방향마다 이동할 길(road)이 'X' 를 포함하는지 체크합니다. X를 포함하면 False를 반환하고 체크 함수를 종료합니다. 

 

::

 

오래간만에 파이썬을 잊지 않으려고 프로그래머스에 들어와봤습니다ㅎㅎ.

알고리즘 문제를 정말 오랜만에 풀어보니 감을 완전히 잃어버렸네요ㅠ 레벨 1도 넘 어렵습니다ㅠ

빡구현으로 풀어서 그냥 참고 정도만 해주시면 감사하겠습니다!

728x90
반응형