일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- backjoon
- SWIFT
- 전자공학
- Trie
- 릿코드
- PYTHON
- 컨볼루션
- leet code
- 코딩테스트
- Leet Coding Challenge
- 신호처리
- 프로그래머스
- 트라이
- 카카오 코딩테스트
- dft
- 알고리즘문제풀이
- 백준
- leetcode
- DTFT
- 스위프트
- 이산신호처리
- 파이썬
- 코테
- 독서노트
- 코테준비
- IOS
- 알고리즘 문제풀이
- SWIFTUI
- DSP
- 알고리즘
Archives
- Today
- Total
매일 매일 성장하는 섭섭군
[Seop's의 코드풀이] 프로그래머스 경주로 건설 - Python 본문
반응형
programmers.co.kr/learn/courses/30/lessons/67259
문제요약
2차원 배열에서 최단거리를 구하는 문제에서 방향을 바꾸었을때 추가적인 비용이 발생하는 문제이다.
목적지 N-1, N-1 에 도달하기 까지 가장 적은 비용을 구해내면 된다.
문제풀이 IDEA
문제를 파악하고 난 후 해결해야 하는 문제는 다음과 같았다.
- 각 칸에서 방향이 변동했는지 확인하기(코너인지 아닌지 파악)
- 가격정보를 어떻게 저장할 것이지?
- 어떤 탐색 방법을 사용할 것인지?
먼저 방향 변동에 대한 확인은 이전 방향과 같은지 파악하면 되었다. 상하좌우 4개 밖에 없기에 이 값을 기억하도록 진행했다.
가격정보는 Board와 똑같은 N*N 배열을 만들어 저장했다. 하지만 해당 위치에서 가격이 같다 할지라도 최종 가격이 달라질 수 있었다.
만들어 놓은 보드에는 최소 값만 저장하도록 진행하였고 현재 위치에서의 가격은 추가로 저장하였다.
배열의 최대 크기가 25*25 이므로 모두다 탐색 가능하다고 판단하여 BFS를 선택하였다.
이러한 정보를 기반으로 BFS를 동작시킬 Queue에 들어갈 정보는 다음과 같았다.
(세로축 좌표, 가로축 좌표, 방향값, 해당 위치의 가격)
Queue의 정보를 가지고 문제에 따라서 BFS를 진행하준다면 가장 적은 비용을 알 수 있다.
전체코드
from collections import deque
class Track :
def __init__(self, board) :
self.board = board
self.N = len(board)
self.check = [[0 for _ in range(self.N) ] for _ in range(self.N) ]
self.di = [-1, 0, 1, 0]
self.dj = [0, 1, 0, -1]
def BFS(self) :
que = deque()
que.append((0,0,0,0))
# i,j,방향, 가격
while que :
i,j,k, v = que.popleft()
for p in range(4) :
ni = i + self.di[p]
nj = j + self.dj[p]
if ni < 0 or nj < 0 or ni >= self.N or nj >= self.N or (ni == 0 and nj == 0 ):
continue
if self.board[ni][nj] == 1 :
continue
if i == 0 and j == 0 :
price = 100
elif k == p :
price = v + 100
else :
price = v + 600
if self.check[ni][nj] == 0 :
self.check[ni][nj] = price
que.append((ni,nj,p, price))
elif price <= self.check[ni][nj] :
que.append((ni, nj, p, price))
self.check[ni][nj] = price
def getAnswer(self) :
self.BFS()
return self.check[-1][-1]
def solution(board):
answer = 0
t = Track(board)
answer = t.getAnswer()
return answer
질문 및 피드백은 언제나 감사드립니다.
반응형
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[Seop's의 코드풀이] 프로그래머스 보석쇼핑 - Python (0) | 2020.10.14 |
---|---|
[Seop's의 코드풀이] 프로그래머스 호텔방 배정 (0) | 2020.10.12 |
[Seop's의 코드풀이] 프로그래머스 자물쇠와 열쇠 (0) | 2020.08.30 |
[Seop's의 코드풀이] 프로그래머스 가사 검색 - Python (0) | 2020.08.28 |
[Seop's의 코드풀이] 프로그래머스 줄 서는 방법 - Python (0) | 2020.08.19 |
Comments