할머니의 콤퓨타 도전기
Javascript로 프로그래머스 스택/큐 문제 풀기 본문
오늘은 자바스크립트로 프로그래머스 고득점 kit 스택/큐 문제를 풀어보았습니다.
1. 기능개발 (Level 2)
https://programmers.co.kr/learn/courses/30/lessons/42586?language=javascript
- 풀이 설명
- 우선 각 기능 별 작업 기간을 구한다.
- 뒷 기능의 작업 기간이 앞선 작업 기간 보다 작을 경우 함께 배포된다.
- 이를 위해 x(앞선 기능 중 가장 긴 작업 기간)를 기준으로 x보다 현재 기능의 작업 기간이 작거나 같게 걸리는 동안 while문을 돈다.
- x보다 작거나 같게 걸린다면 cnt를 1씩 증가시켜 함께 배포될 기능의 수를 센다.
- 작업 기간이 x보다 오래걸리는 기능이 등장하게 되면 while문을 벗어나고 cnt를 answer에 push한다. 또한 x 값이 갱신된다.
- 이를 위해 x(앞선 기능 중 가장 긴 작업 기간)를 기준으로 x보다 현재 기능의 작업 기간이 작거나 같게 걸리는 동안 while문을 돈다.
- 코드 구현
- 자바스크립트 나누기에서 몫은 parseInt로 정수로 변환해 구할 수 있다.
function solution(progresses, speeds) {
let answer = [];
let period = [];
for(let i=0; i < progresses.length; i++){
period[i] = parseInt((100-progresses[i])/speeds[i]) + !!((100-progresses[i])%speeds[i]);
}
for(let i=0; i < period.length; i++){
let x = period[i];
let cnt = 0;
while(x >= period[i]){
cnt += 1;
i += 1;
}
i -= 1;
answer.push(cnt);
}
return answer;
}
- 다른 사람 코드
- 이 코드가 훨씬 깔끔하고 좋은 것 같다.
- Math.ceil을 사용하면 나머지에 관한 처리를 따로 해주지 않아도되는구나.
function solution(progresses, speeds) {
let answer = [0];
let days = progresses.map((progress, idx) => Math.ceil((100-progress)/speeds[idx]));
let maxDay = days[0];
for(let i=0, j=0; i<days.length; i++){
if(days[i] <= maxDay){
answer[j] += 1;
}
else{
answer[++j] = 1;
maxDay = days[i];
}
}
return answer;
}
2. 프린터 (Level 2)
https://programmers.co.kr/learn/courses/30/lessons/42587?language=javascript
- 풀이 설명
- 주석으로 설명해두었다.
- 코드 구현
- 기존에는 c++의 priority_queue를 이용해서 구현했었는데 javascript에는 따로 구현되어있는게 없는 것 같다.
- 따라서 가장 앞에 있는 문서보다 중요도가 높은 문서가 존재하는지 check하기 위해 some()을 이용한다.
- https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/some
- some()은 callback 함수가 true가 되는 요소를 찾을 때까지 배열에 있는 요소에 대해 callback 함수를 실행한다.
- shift()는 배열에서 첫 번째 요소를 제거하고 반환한다고 한다.
function solution(priorities, location) {
let answer = 1;
let top = -1;
while (priorities.length > 0){
top = priorities.shift(); // 가장 앞에 있는 문서 꺼냄
// 중요도 높은 문서 존재 check
if (priorities.some(priority => priority > top)){
priorities.push(top); // 대기 목록 마지막에 push
}
else {
if (location === 0) break; // 요청 문서 인쇄
else answer ++;
}
if (location === 0) // 요청 문서의 중요도가 가장 높지 않는 경우
location = priorities.length -1;
else location --;
}
return answer;
}
3. 다리를 지나는 트럭 (Level 2)
https://programmers.co.kr/learn/courses/30/lessons/42583
- 풀이 설명
- 우선 0으로 bridge_length 만큼 bridge를 채운다.
- 1초마다 1칸씩 이동이 가능하니, 매번 bridge의 앞에서 하나씩 빼고 트럭을 올릴 수 있다면 트럭을 bridge에 올리고, 그렇지 않다면 0으로 채운다.
- 코드 구현
- new Array()로 원하는 길이의 배열을 선언할 수 있다.
- fill 메서드를 통해 배열의 값을 채워줄 수 있다.
function solution(bridge_length, weight, truck_weights) {
let answer = 0;
let bridge = new Array(bridge_length).fill(0);
while(bridge.length){
answer ++;
bridge.shift();
if(truck_weights.length){ // 올릴 트럭이 남아있다면
let truck = truck_weights[0];
const total_weight = bridge.reduce((acc, val) => acc + val, 0);
if(truck + total_weight <= weight){
bridge.push(truck_weights.shift());
}else{
bridge.push(0);
}
}
}
return answer;
}
'Algorithm > Problem Solving' 카테고리의 다른 글
Javascript로 프로그래머스 정렬 문제 풀기 (0) | 2021.06.25 |
---|---|
Python으로 백준 16987번을 풀어보자 (0) | 2021.06.23 |
Javascript로 프로그래머스 해시 문제 풀기 (0) | 2021.06.22 |
Programmers: 신규 아이디 추천 (0) | 2021.04.29 |
Programmers: 추석 트래픽 (0) | 2021.04.28 |
Comments