반응형
문제
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
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스|파이썬] k진수에서 소수 개수 구하기 (2022 KAKAO BLIND RECRUITMENT/lv.2) (0) | 2023.05.22 |
---|---|
[프로그래머스|파이썬] 뒤에 있는 큰 수 찾기 (연습문제/lv.2) (0) | 2023.05.22 |
[프로그래머스|파이썬] 베스트앨범 (해시/level 3) (0) | 2023.04.29 |
[프로그래머스|파이썬] 달리기 경주 (연습문제/level 1) (0) | 2023.04.27 |
[프로그래머스 | 파이썬 / 자바스크립트] 게임 맵 최단거리(깊이/너비 우선 탐색(DFS/BFS)/level 2) (0) | 2023.04.10 |
[프로그래머스 | 파이썬 / 자바스크립트] 타겟 넘버(깊이/너비 우선 탐색(DFS/BFS)/level 2) (0) | 2023.04.02 |