공원 산책
풀이
문제가 길긴 했지만 몇 가지만 주의 하면 되는 문제이다.
결국은 if else문을 잘 쓸줄 아느냐 행렬을 사용할 줄 아느냐에 대한 문제이다.
- 각 기본 사항에 대해서 입력
- 시작 위치를 설정
- 시작 위치를 기반으로 행렬작동
- 행렬 작동간 로봇 강아지가 입력 거부 안하고 진행할 경우에만 로봇 강아지의 위치 조정
- 마지막 위치 반환
# 지나다니는 길을 'O', 장애물을 'X'로 나타낸 공원
# 로봇 강아지의 산책
# 입력 중에서 E 5 로 주어졌을 때, 이동 중 장애물을 만나거나 공원을 벗어난다면 이번 입력 수행 안함.
def solution(park, routes):
answer = 'NSWE'
H = len(park)
W = len(park[0])
d_dic = {"N":0,"S":1,"W":2,"E":3}
# 상하좌우
dr = [-1,1,0,0]
dc = [0,0,-1,1]
find_s = False
# 시작지점, cr, cs 구하기
for r in range(H):
for c in range(W):
if park[r][c] == 'S':
cr = r
cc = c
find_s = True
break
if find_s:
break
# 최종 위치 찾기
for i in range(len(routes)):
tmp = list(map(str, routes[i].split()))
# 방향
dt = d_dic[tmp[0]]
# 거리
ds = int(tmp[1])
# 로봇 강아지가 제대로 임무 수행 할 수 있는 경우만 찾기
# 로봇 강아지가 공원안에 있을 수 있는지 확인
if (0 <= cr + (dr[dt]*ds) < H and 0 <= cc + (dc[dt]*ds) < W):
# 로봇 강아지가 장애물을 마주치는 지 확인
for j in range(1, ds+1):
if park[cr+(dr[dt]*j)][cc + (dc[dt]*j)] == 'X':
break
else:
cr = cr + (dr[dt]*ds)
cc = cc + (dc[dt]*ds)
print(cr, cc)
return [cr, cc]
다른 사람 풀이
나와는 다르게 애초에 dx, dy라는 딕셔너리 변수로 미리 방향에 따른 값을 적용시켜놨다.
그 이후는 비슷하다고 봐도 무방하겠다.
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
클래스를 이용해서 푼 사람이다... 허허.... 아직도 난 멀었다.
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]
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 Lv1 [PCCP 기출문제] 1번 / 붕대 감기 (python) (0) | 2024.02.14 |
---|---|
프로그래머스 Lv2 튜플 (python) (1) | 2024.02.13 |
프로그래머스 Lv1 성격 유형 검사하기 (python) (1) | 2024.02.11 |
프로그래머스 Lv1 가장 많이 받은 선물 (python) (1) | 2024.02.10 |
프로그래머스 Lv1 실패율(python) (1) | 2024.02.09 |