Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
Tags
- 문자형 배열
- 회전 및 자리 이동 연산
- LAN의 분류
- 문제해결 단계
- IPv4 주소체계
- r-value참조자
- 프로그래머스 푸드 파이트 대회
- 입출력 관리자
- 값/참조/주소에 의한 전달
- const화
- 프로그래머스 배열만들기4
- 주기억장치
- 백준 파이썬
- l-value참조자
- 논리 연산
- 범위 기반 for문
- const l-value참조자
- C언어 계산기 프로그램
- c언어 괄호검사
- 운영체제 기능
- 네트워크 결합
- C언어 덱
- string유형
- getline()함수
- auto 키워드
- 유형 변환
- 원형 연결 구조 연결된 큐
- 괄호 검사 프로그램
- C언어 스택 연산
- 알고리즘 조건
Archives
- Today
- Total
chyam
[프로그래머스 Lv3, python] - 미로 탈출 명령어 본문

https://school.programmers.co.kr/learn/courses/30/lessons/150365
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
# 내 풀이..
import sys
sys.setrecursionlimit(5000)
def solution(n, m, x, y, r, c, k):
pos = []
direct = [[1,0],[0,-1],[0,1],[-1,0]]
# 만약 탈출지점에 도착했더라도 끝낼수없음. 거리가 k여야함.. 같은 곳 가도 됨.=> K이하까지만 탐색하기..
def dfs(px, py, st):
if len(st) == k: # 다 도달했음.
if [r-1,c-1] == [px,py]: # 도착지점임.
if len(pos) == 0: # 순서대로 접근하기 때문에 처음에 도착하는 곳이 제일 빠름!
pos.append(st)
return
if pos:
return
for x, y in direct:
dx, dy = px + x, py + y
dist = abs(dx - (r-1)) + abs(dy - (c-1))
remain = k - (len(st) + 1)
if dist > remain:
continue
if (remain - dist) % 2 == 1:
continue
if 0 <= dx < n and 0 <= dy < m: # 이동 가능
if [x,y] == [0,1]: # 오른쪽 이동
dfs(dx,dy,st+'r')
elif [x,y] == [1,0]: # 아래쪽 이동
dfs(dx,dy,st+'d')
elif [x,y] == [0,-1]: # 왼쪽 이동
dfs(dx,dy,st+'l')
elif [x,y] == [-1,0]: # 위쪽 이동
dfs(dx,dy,st+'u')
dfs(x-1,y-1,'')
if pos:
return pos[0]
return "impossible"
# 지피티가 최적화한 풀이(그리디 사용)
def solution(n, m, x, y, r, c, k):
x -= 1
y -= 1
r -= 1
c -= 1
dist = abs(x - r) + abs(y - c) # 출발지에서 목적지 맨해튼 거리
if dist > k or (k - dist) % 2: # k보다 크거나 차이가 홀수이면 불가능함.
return "impossible"
answer = []
directions = [ # 사전순서대로 배치
(1, 0, 'd'),
(0, -1, 'l'),
(0, 1, 'r'),
(-1, 0, 'u')
]
for step in range(k):
for dx, dy, ch in directions:
nx = x + dx
ny = y + dy
if not (0 <= nx < n and 0 <= ny < m):
continue
remain = k - step - 1 # 남은 횟수
new_dist = abs(nx - r) + abs(ny - c) # 남은 거리
# 남은 횟수보다 크거나 차이가 홀수이면 불가능함.
if new_dist <= remain and (remain - new_dist) % 2 == 0:
answer.append(ch)
x, y = nx, ny
break
return ''.join(answer)'프로그래머스 > LV3' 카테고리의 다른 글
| [프로그래머스 Lv3, python] - 양과 늑대 (0) | 2026.07.20 |
|---|---|
| [프로그래머스 Lv3, python] - 표 편집 (0) | 2026.07.16 |
| [프로그래머스 Lv3, python] - 인사고과 (0) | 2026.07.15 |
| [프로그래머스 Lv3, python] - 디스크 컨트롤러 (0) | 2026.07.09 |
| [프로그래머스 Lv3, python] - 자물쇠와 열쇠 (0) | 2026.07.07 |
