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
- JS
- 과제진행하기
- 지도 여러개
- React.StrictMode
- 코어자바스크립트
- 최소스패닝트리
- 타겟넘버
- 알고리즘 문제풀이
- Lv3
- 백준 알고리즘
- JS스터디
- 2023카카오블라인드코테
- pccp기출문제
- div2개
- [pccp 기출문제]
- solved.ac플래티넘
- 우박수열정적분
- 프로그래머스
- 스택
- solved.ac골드
- 정렬
- 이중지도
- 백준알고리즘
- Lv2
- 5강클로저
- 알고리즘문제풀이
- 두원사이의정수쌍
- 비트마스크
- DP
- c++
Archives
- Today
- Total
호지
[프로그래머스] [PCCP 기출문제] 2번/ 석유시추 문제풀이 JS 본문
BFS를 활용한 문제이다.
시추관이 뽑을 수 있는 석유의 최대값을 구하기 위해,
시추관이 들어갈 수 있는 모든 경우의 수를 탐색한다.
효율성을 위해 한번 탐색했던 석유 덩어리의 크기는 별도로 저장한다.
(total)
시추관이 들어갈 수 있는 모든 경우의 수를 탐색할 때,
해당 위치의 land값이 1이라면 처음 만난 석유 덩어리이므로
Queue를 활용한 BFS탐색을 통해 해당 석유 덩어리의 크기를 구한다.
(상하좌우 가능한 모든 경우의 수를 탐색)
다시 재탐색을 막기 위해 해당 값은 visited 표시를 하는데,
visited는 음수 값으로, 같은 덩어리일 경우 같은 수를 갖게하여
시추관이 같은 석유 덩어리를 뽑는 것인지 판별할 수 있게 구현하였다.
(land에 음수로 업데이트)
시추관이 한번 접근된 경우라면, 이미 해당 시추관이 이 석유덩어리에 접근했느지 판별하고,
(!check.includes(land[i][j])
석유 양을 더해준다.
class Queue {
constructor() {
this.data = {}
this.head = 0
this.tail = 0
}
size() {
return this.tail - this.head
}
push(element) {
this.data[this.tail++] = element
}
pop() {
const removed = this.data[this.head]
delete this.data[this.head]
this.head++
if (this.head === this.tail) {
this.head = 0
this.tail = 0
}
return removed
}
}
const solution = (land) => {
const n = land.length
const m = land[0].length
let visited = -1
const total = {}
let answer = 0
const q = new Queue()
const directions = [
[1, 0],
[0, 1],
[0, -1],
[-1, 0],
]
for (let j = 0; j < m; j++) {
let sum = 0
const check = []
for (let i = 0; i < n; i++) {
if (land[i][j] === 1) {
let count = 1
land[i][j] = visited
q.push([i, j])
while (q.size() !== 0) {
const [x, y] = q.pop()
for (const [dx, dy] of directions) {
const nx = x + dx
const ny = y + dy
if (nx >= 0 && nx < n && ny >= 0 && ny < m && land[nx][ny] === 1) {
count++
land[nx][ny] = visited
q.push([nx, ny])
}
}
}
sum += count
check.push(visited)
total[visited--] = count
} else if (land[i][j] < 0 && !check.includes(land[i][j])) {
check.push(land[i][j])
sum += total[land[i][j]]
}
}
if (sum > answer) answer = sum
}
return answer
}
https://school.programmers.co.kr/learn/courses/30/lessons/250136
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 주차 요금 계산 문제풀이 JS (0) | 2024.07.26 |
---|---|
[프로그래머스] [PCCP 기출문제] 1번 / 붕대 감기 문제풀이 JS (0) | 2024.07.22 |
[프로그래머스] 우박수열 정적분 문제풀이 JS (0) | 2023.09.19 |
[프로그래머스] 숫자카드 나누기 문제풀이 JS (0) | 2023.09.19 |
[프로그래머스] 귤 고르기 문제풀이 JS (0) | 2023.09.19 |
Comments