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
- cors
- APOLLO
- 포인터
- 코딩테스트
- 브라우저
- 자료구조
- GraphQL
- 연결리스트
- vue3
- 타입스크립트
- 자바스크립트
- 해시테이블
- 프론트엔드
- 릿코드
- alexnet
- pytorch
- RT scheduling
- 큐
- 컨테이너
- 이진탐색
- 웹팩
- Machine Learning
- 프로그래머스
- 배열
- 스택
- RxJS
- C
- 연결 리스트
- 프로세스
- 알고리즘
Archives
- Today
- Total
프린세스 다이어리
[프로그래머스] 다리를 지나는 트럭 문제 - 자바스크립트 배열, 연결 리스트 두가지 방법으로 본문
728x90
1. 배열로 접근하는 방법
전체 풀이
function solution(bridge_length, weight, truck_weights) {
// queue 초기화
let queue = new Array(bridge_length).fill(0);
let seconds = 0;
while (queue.length) {
// queue 하나씩 실행
queue.shift();
seconds++;
let queueSum = queue.reduce((acc,cur) => acc + cur, 0);
if (truck_weights.length) {
if (queueSum + truck_weights[0] <= weight) {
// 1. 현재 queueSum과 truck_weights[0] 합이 weight보다 같거나 작으면 -> queue에 push();
let temp = truck_weights.shift();
queue.push(temp);
} else {
// 2. 현재 queueSum과 truck_weights[0] 합이 weight를 넘으면 -> queue에 push(0)
queue.push(0);
}
}
}
return seconds;
}
(1) queue 초기화해주고 while문에서 queue를 하나씩 실행하면서 맨 앞의 원소를 shift() 해준다.
let queue = new Array(bridge_length).fill(0);
let seconds = 0;
(2) 현재 다리를 지나는 queue의 트럭의 무게를 합을 구한다.
let queueSum = queue.reduce((acc,cur) => acc + cur, 0);
(3) 다리 위 트럭무게에 대기 중인 맨 앞 트럭의 무게를 더한 값을 다리가 버틸 수 있는지 없는지 분기해서 queue에 트럭을 push 할지, 0을 push 할지 판단한다.
if (truck_weights.length) {
if (queueSum + truck_weights[0] <= weight) {
let temp = truck_weights.shift();
queue.push(temp);
} else {
queue.push(0);
}
}
2. 연결 리스트로 구현하기
첨부한 이미지를 보면 코드 효율성이 많이 떨어짐을 알 수 있다. 이 문제는 특정 인덱스에 해당하는 노드를 찾을 필요가 없고 FIFO로만 구현하면 되기 때문에 배열보다는 연결 리스트로 푸는 것이 훨씬 효율성 측면에서 좋다.
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class Queue {
constructor() {
this.head = null;
this.rear = null;
this.count = 0;
this.sum = 0;
}
enqueue(data) {
const node = new Node(data);
if (this.head) {
this.rear.next = node;
} else {
this.head = node;
}
this.rear = node;
this.sum += data;
this.count++;
}
dequeue() {
if (!this.head) {
return;
}
const data = this.head.data;
this.head = this.head.next;
this.count--;
this.sum -= data;
return data;
}
getFirst() {
if (this.head) {
return this.head.data;
} else {
return false;
}
}
getQueue() {
if (this.count === 0) {
return false;
} else {
let node = this.head;
let array = [];
while (node) {
array.push(node);
node = node.next;
}
return array;
}
}
}
기본적인 자바스크립트 연결리스트 구현법을 활용하여 큐에 필요한 함수를 정의했다. 먼저 노드 클래스를 정의해 주고, 큐 클래스에는 큐의 초기 형태와 큐에 원소를 추가, 삭제, 반환하는 함수를 만들어줬다. 큐에 들어가 있는 트럭의 무게의 합을 구해야 하므로 enqueue, dequeue 함수에 전체 큐에 올라간 무게까지 연산하는 로직을 추가했다. 참고로 이 문제에서는 반환하는 함수는 필요가 없고 enqueue, dequeue만 있으면 된다.
function solution(bridge_length, weight, truck_weights) {
let seconds = 0;
let queue = new Queue();
for (let i = 0; i < bridge_length; i++) {
queue.enqueue(0);
}
while (queue.count) {
queue.dequeue();
seconds++;
if (truck_weights.length) {
if (queue.sum + truck_weights[0] <= weight) {
queue.enqueue(truck_weights.shift());
} else {
queue.enqueue(0);
}
}
}
return seconds;
}
위에서 배열로 푸는 방법과 똑같이 풀었다. 배열로 푼 답안을 보고 작성한 결과가 계속 0이 나오길래 엄청 고민해서 원인을 찾았는데, while문에서 queue.length로 참 조건을 판단하고 있었던..;; 덕분에 3시간 동안 삽질했다. 아오..
연결 리스트의 효율성은 어마무시했다!
728x90
'자료구조, 알고리즘' 카테고리의 다른 글
자바스크립트 핵간단한 퀵정렬 코드 (0) | 2021.10.31 |
---|---|
[프로그래머스] 주식가격 문제 C언어 스택 활용한 풀이 (0) | 2021.10.28 |
자바스크립트로 연결 리스트(Linked List) 구현하기 (0) | 2021.10.26 |
[프로그래머스] 프린터 대기목록 순서 구하기 문제 - 자바스크립트 (0) | 2021.10.24 |
자료구조 큐의 개념과 배열로 구현하는 방법 (0) | 2021.10.24 |
Comments