일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 채권
- 독서
- 지혜를가진흑곰
- 성분
- 자바
- 경제
- 자바스크립트
- 알고리즘 공부
- 백준알고리즘
- 알고리즘공부
- 다독
- 프로그래머스 알고리즘 공부
- 책을알려주는남자
- 투자
- 주식
- Java
- algorithmTest
- 책알남
- JavaScript
- 독후감
- 알고리즘트레이닝
- C++
- algorithmtraining
- algorithmStudy
- 화장품
- 돈
- C
- 서평
- 재테크
- 프로그래밍언어
Archives
- Today
- Total
탁월함은 어떻게 나오는가?
[Algorithm] 미로 탈출 ( Programmers / Python, JavaScript ) 본문
[Snow-ball]프로그래밍(컴퓨터)/Algorithm Training
[Algorithm] 미로 탈출 ( Programmers / Python, JavaScript )
Snow-ball 2024. 3. 21. 10:56반응형
문제 설명
1 x 1 크기의 칸들로 이루어진 직사각형 격자 형태의 미로에서 탈출하려고 합니다. 각 칸은 통로 또는 벽으로 구성되어 있으며, 벽으로 된 칸은 지나갈 수 없고 통로로 된 칸으로만 이동할 수 있습니다. 통로들 중 한칸에는 미로를 빠져나가는 문이 있는데, 이 문은 레버를 당겨서만 열 수 있습니다. 레버 또한 통로들 중 한 칸에 있습니다. 따라서, 출발 지점에서 먼저 레버가 있는 칸으로 이동하여 레버를 당긴 후 미로를 빠져나가는 문이 있는 칸으로 이동하면 됩니다. 이때 아직 레버를 당기지 않았더라도 출구가 있는 칸을 지나갈 수 있습니다. 미로에서 한 칸을 이동하는데 1초가 걸린다고 할 때, 최대한 빠르게 미로를 빠져나가는데 걸리는 시간을 구하려 합니다.
미로를 나타낸 문자열 배열 maps 가 매개변수로 주어질 때, 미로를 탈출하는데 필요한 최소 시간을 retrun 하는 soultion 함수를 완성해주세요. 만약, 탈출할 수 없다면 -1을 return 해주세요.
제한사항
입출력 예
풀이 코드
미로 탈출 문제의 경우 bfs를 2번사용해서 풀 수 있는 문제였다.
우선 start('S')부터 lever('L')까지 검사를 시작하고, lever('L')부터 exit('E')까지 검사하면 된다.
python:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
from collections import deque
def bfs(maps, start, end, count):
N = len(maps)
M = len(maps[0])
visit_check = [[0 for _ in range(M)] for _ in range(N)]
queue = deque([[0, 0, count]])
loop_exit = False
for i in range(N):
for j in range(M):
if maps[i][j] == start:
queue[0][0], queue[0][1] = i, j
visit_check[i][j] = 1
loop_exit = True
break
if loop_exit:
break
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
while queue:
x, y, c = queue.popleft()
for i in range(4):
nx, ny = directions[i][0] + x, directions[i][1] + y
if 0 <= nx < N and 0 <= ny < M and maps[nx][ny] == end:
return c + 1
if 0 <= nx < N and 0 <= ny < M and maps[nx][ny] != 'X':
if visit_check[nx][ny] == 0:
visit_check[nx][ny] = 1
queue.append([nx, ny, c + 1])
return -1
def solution(maps):
S_to_L = bfs(maps, 'S', 'L', 0)
if S_to_L == -1:
return -1
L_to_E = bfs(maps, 'L', 'E', S_to_L)
if L_to_E == -1:
return -1
return L_to_E
|
cs |
javascript:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
function solution(maps) {
const sToL = bfs(maps, "S", "L");
if (sToL === -1) return -1;
const lToE = bfs(maps, "L", "E");
if (lToE === -1) return -1;
return sToL + lToE;
}
function bfs(graph, start, end) {
let visited = Array.from({ length: graph.length }, () =>
Array(graph[0].length).fill(0),
);
let queue = new Queue();
let check = false;
for (let i = 0; i < graph.length; ++i) {
for (let j = 0; j < graph[0].length; ++j) {
if (graph[i][j] === start) {
queue.enqueue([i, j, 0]);
visited[i][j] = 1;
}
if (queue.size() > 0) {
check = true;
break;
}
}
if (!!check) break;
}
while (queue.size() > 0) {
const [x, y, c] = queue.dequeue();
const directions = [
[-1, 0],
[1, 0],
[0, -1],
[0, 1],
];
for (const [dx, dy] of directions) {
const nx = dx + x;
const ny = dy + y;
if (
0 <= nx &&
nx <= graph.length - 1 &&
0 <= ny &&
ny <= graph[0].length - 1 &&
visited[nx][ny] === 0 &&
graph[nx][ny] !== "X"
) {
if (graph[nx][ny] === end) {
return c + 1;
}
queue.enqueue([nx, ny, c + 1]);
visited[nx][ny] = 1;
}
}
}
return -1;
}
class Queue {
constructor() {
this.items = [];
}
enqueue(element) {
this.items.push(element);
}
dequeue() {
return this.items.shift();
}
size() {
return this.items.length;
}
}
|
cs |
https://school.programmers.co.kr/learn/courses/30/lessons/159993
반응형
'[Snow-ball]프로그래밍(컴퓨터) > Algorithm Training' 카테고리의 다른 글
[Algorithm] 연속 펄스 부분 수열의 합 ( Programmers / Python ) (1) | 2024.03.29 |
---|---|
[Algorithm] 무인도 여행 ( Programmers / Python ) (1) | 2024.03.24 |
[Algorithm] 리코쳇 로봇 ( Programmers / Python ) (2) | 2024.03.14 |
[Algorithm] 구명보트 ( Programmers / Python && Java ) (1) | 2024.03.06 |
[Algorithm] 도넛과 막대 그래프 (Programmers - 2024 KAKAO WINTER INTERSHIP / python ) (0) | 2024.03.04 |
Comments