카테고리 없음

Programmers - 공원 산책

취업하고싶다! 2023. 11. 1. 14:16
 

프로그래머스

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

programmers.co.kr

 

문제

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

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

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

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

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

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

 

제한사항

  • 3 ≤ park의 길이 ≤ 50
  • 1 ≤ routes의 길이 ≤ 50

 

 

접근 방식

전형적인 dx, dy 문제

하지만 dx, dy 접근이 익숙하지 않아 하드코딩으로 진행함

 

배열의 가로 및 세로 길이를 wid, hei 변수에 할당

그리고 입력받는 park가 ['SOO', 'OOO', 'OOX'] 이런식으로 문자열들이 붙어서 나오기 때문에

answer이라는 빈 배열을 선언하고 park를 x 인자로 돌면서 list(x)로 한 문자씩 잘라서 answer 배열에 저장

 

그리고 'S'의 위치를 찾기 위해 answer 배열안을 탐색하면서 S를 찾으면 S의 행, 열 위치를 index_first, index_second에 할당해주고 각 값을 a, b 변수에 저장

 

그리고 routes가 ["E 2","S 3","W 1"] 이런식으로 문자와 숫자가 빈 칸을 띄고 나오기 때문에 해당 배열을 split으로 key, value로 나눠줌

그리고 cnt 라는 변수를 0으로 선언해줌

cnt 변수를 선언한 이유는 아래 로직에서 필요하기 때문

 

이제 value만큼 for문을 돌면서 key값이 E, W, S, N 일 때를 찾음

예로 'E' 가 나오면 오른쪽으로 이동하는 것이기에 b의 위치를 옮겨야 함

근데 현재 위치에서 오른쪽으로 이동하려할 때 전체 너비보다 더 큰 값이 오면 해당 명령은 취소해야 함

value(이동해야하는 칸 수)가 얼마든 일단 1개씩 이동

따라서 b + 1 이 wid보다 작거나 같고 park[a][b+1]이 'X'가 아니면 b의 위치를 오른쪽으로 한 칸 이동시킴

그리고 cnt 값도 +1을 해줌

왜냐면 예로 시작점이 0,0이고 첫 번째 명령이 [E 3]인데 배열의 [0][3]가 'X'일 경우, 방금 위의 식으로 [0][2]까지는 조건에 위배되지 않으므로 한 칸 이동해서 [0][2]이 된 상태임. 이 상태에서 한 번 더 이동해야 하는데 [a][b+1] == 'X'이므로 조건에 위배됨

따라서 이 명령은 취소되야 함. 즉, 다시 [0][0] 으로 돌아가야 함. 이 때 if문에 충족할 때 마다 cnt값을 하나씩 더해주지 않으면 명령이 취소될 때 시작점이 어딘지 찾지 못하는 문제가 발생하므로 cnt값을 누적시켜서 명령이 취소될 때 시작점으로 다시 돌아가게 해줌

 

이런식으로 키가 W, S, N일 때도 a, b값을 갱신해주고 return [a, b]를 통해 답 출력

 

 

코드

# # 프로그래머스 Lv1 공원 산책

def solution(park, routes):
    answer = []

    # 가로 및 세로 길이 구하기
    wid = len(park[0]) - 1
    hei = len(park) - 1
    
    # park 안의 문자열 하나씩 자르기
    for x in park:
        answer.append(list(x))
    
    for row in answer:
        if 'S' in row:
            index_first = row.index('S')
            index_second = answer.index(row)
            break     
    
    # S의 행, 열 인덱스값 구하기
    a, b = index_second, index_first
    
    for item in routes:
        key, value = item.split()
        value = int(value) 
        cnt = 0

        for i in range(value):
            if key == 'E':
                if b + 1 <= wid and park[a][b+1] != 'X':
                    b += 1
                    cnt += 1
                else:
                    b -= cnt
                    break
            
            if key == 'W':
                if b - 1 >= 0 and park[a][b-1] != 'X':
                    b -= 1
                    cnt += 1
                else:
                    b += cnt
                    break
            
            if key == 'S':
                if a + 1 <= hei and park[a+1][b] != 'X':
                    a += 1
                    cnt += 1
                else:
                    a -= cnt
                    break
                    
            if key == 'N':
                if a -1 >= 0 and park[a-1][b] != 'X':
                    a -= 1
                    cnt += 1
                else:
                    a += cnt
                    break
                
    return [a,b]

park = 	["SOO", "OXX", "OOO"]
routes = ["E 2","S 3","W 1"]
result = solution(park, routes)
print(result)