반응형
문제
- 문제 링크: 지형 이동
해설
- 자료구조:
- 시간복잡도:
(풀이과정)
1)
2)
3)
4)
코드
(C언어)
solution 1)
더보기
solution 1
#include<>
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(C++)
solution 1)
더보기
#include<>
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(C#)
solution 1)
더보기
#include<>
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(Java)
solution 1)
- N: land의 한 변의 길이
- 각 지점을 방문하는데 필요힌 시간 복잡도: O(N^2)
- 우선순위 큐를 활용해 너비 우선 탐색을 진행하므로 최종 시간 복잡도는 O(N^2 * log(N^2))
더보기
import java.util.PriorityQueue;
class Solution {
private static class Node {
int i, j, cost;
public Node(int i, int j, int cost) {
this.i = i;
this.j = j;
this.cost = cost;
}
}
public int solution(int[][] land, int height) {
int answer = 0;
int n = land.length;
// 주변 노드 탐색을 위해 di, dj
int[] di = {-1, 0, 1, 0};
int[] dj = {0, 1, 0, -1};
boolean[][] visited = new boolean[n][n];
// 시작 노드 추가
PriorityQueue<Node> pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1.cost, o2.cost));
pq.add(new Node(0, 0, 0));
// BFS + 우선순위 큐로 다음 노드 관리
while (!pq.isEmpty()) {
Node now = pq.poll();
// 아직 방문하지 않은 경로만 탐색
if (visited[now.i][now.j])
continue;
visited[now.i][now.j] = true;
// 현재까지 비용을 합산
answer += now.cost;
for (int i = 0; i < 4; ++i) {
int ni = now.i + di[i];
int nj = now.j + dj[i];
// 유효한 인덱스가 아닐 경우
if (!(0 <= ni && ni < n && 0 <= nj && nj < n))
continue;
int tempCost = Math.abs(land[now.i][now.j] - land[ni][nj]);
// 입력으로 주어진 height보다 높이차가 큰 경우
int newCost = tempCost > height ? tempCost : 0;
// 다음 경로를 add
pq.add(new Node(ni, nj, newCost));
}
}
return answer;
}
}
solution 2)
더보기
#include<>
solution 3)
더보기
#include<>
(Python)
solution 1)
- N: land의 한 변의 길이
- 각 지점을 방문하는데에 필요한 시간 복잡도: O(N^2)
- 우선순위 큐를 활용해 너비 우선 탐색을 진행하므로 최종 시간 복잡도: O((N^2)*log(N^2))
더보기
from heapq import heappush, heappop
def solution(land, height):
answer = 0
n = len(land)
# 주변 노드 탐색을 위한 di, dj
di = [-1, 0, 1, 0]
dj = [0, 1, 0, -1]
visited = [[False] * n for _ in range(n)]
# 시작 노드 추가
q = []
heappush(q, [0,0,0]) # [비용, i, j]
# BFS + 우선순위 큐로 다음 노드 관리
while q:
cost, i, j = heappop(q)
# 아직 방문하지 않은 경로만 탐색
if not visited[i][j]:
visited[i][j] = True
# 현재까지 비용을 합산
answer += cost
for d in range(4):
ni, nj = i + di[d], j + dj[d]
# 유효한 인덱스일 경우
if 0 <= ni < n and 0 <= nj < n:
temp_cost = abs(land[i][j] - land[ni][nj])
# 입력으로 주어진 height보다 높이차가 큰 경우
if temp_cost > height:
new_cost = temp_cost
else:
new_cost = 0
# 다음 경로를 푸시
heappush(q, [new_cost, ni, nj])
return answer
solution 2)
더보기
import
solution 3)
더보기
import
(JavaScript)
solution 1)
- N: land의 한 변의 길이
- 각 지점을 방문하는데 필요한 시간 복잡도: O(N^2)
- 우선순위 큐를 활용해 너비 우선 탐색을 진행: O(N^2 * log(N^2))
더보기
class MinHeap {
constructor() {
this.items = [];
}
size() {
return this.items.length;
}
push(item) {
this.items.push(item);
this.bubbleUp();
}
pop() {
if (this.size() === 0) {
return null;
}
const min = this.items[0];
this.items[0] = this.items[this.size() - 1];
this.items.pop();
this.bubbleDown();
return min;
}
swap(a, b) {
[this.items[a], this.items[b]] = [this.items[b], this.items[a]];
}
bubbleUp() {
let index = this.size() - 1;
while (index > 0) {
const parentIndex = Math.floor((index - 1) / 2);
if (this.items[parentIndex][0] <= this.items[index][0]) {
break;
}
this.swap(index, parentIndex);
index = parentIndex;
}
}
bubbleDown() {
let index = 0;
while (index * 2 + 1 < this.size()) {
let leftChild = index * 2 + 1;
let rightChild = index * 2 + 2;
let smallerChild =
rightChild < this.size() &&
this.items[rightChild][0] < this.items[leftChild][0]
? rightChild
: leftChild;
if (this.items[index][0] <= this.items[smallerChild][0]) {
break;
}
this.swap(index, smallerChild);
index = smallerChild;
}
}
}
function solution(land, height) {
let answer = 0;
const n = land.length;
// 주변 노드 탐색을 위한 di, dj
const di = [-1, 0, 1, 0];
const dj = [0, 1, 0, -1];
const visited = Array.from(Array(n), () => Array(n).fill(false));
// 시각 노드 추가
const q = new MinHeap();
q.push([0, 0, 0]); // [비용, i, j]
// BFS + 우선 순위 큐로 다음 노드 관리
while (q.size() > 0) {
const [cost, i, j] = q.pop();
// 아직 방문하지 않은 경로만 탐색
if (!visited[i][j]) {
visited[i][j] = true;
// 현재까지 비용을 합산
answer += cost;
for (let d = 0; d < 4; ++d) {
const ni = i + di[d];
const nj = j + dj[d];
// 유효한 인덱스일 경우
if (0 <= ni && ni < n && 0 <= nj && nj < n) {
const tempCost = Math.abs(land[i][j] - land[ni][nj]);
// 입력으로 주어진 height보다 높이차가 큰 경우
const newCost = tempCost > height ? tempCost : 0;
// 다음 경로를 푸시
q.push([newCost, ni, nj]);
}
}
}
}
return answer;
}
solution 2)
더보기
import
solution 3)
더보기
import
반응형
'1-4. 코딩테스트 문제집(진행중) > PCCP(Lv4)' 카테고리의 다른 글
[PCCP] Lv4: 단어 퍼즐(12983) 해설 (0) | 2024.12.26 |
---|---|
[PCCP] Lv4: 도둑질(42897)해설 (0) | 2024.12.26 |