[알고리즘 스터디] 2주차
❔ 같은 숫자는 싫어
처음엔 중복을 완전 없애는 문제인줄 알고 Set을 이용했지만 테스트케이스 1번에서 걸러졌다. filter를 사용해 이전 원소와 현재 원소가 같은지 체크하여 다른경우 해당원소를 배열에 추가 함으로써 해결.
문제풀이
function solution(arr) {
return arr.filter((x, i) => x != arr[i - 1]);
}
❔ 크레인 인형뽑기
이거 레벨1 문제 맞나여? 아닌것 같은디? board 배열의 행과 열을 바꿔준 다음 filter함수를 이용해 0을 제거한 스택을 만들어 하나씩 pop해줬다.
문제풀이
function solution(board, moves) {
var answer = 0;
let bascket = [];
let stack = board.reduce((acc, cur, i, m) => {
let trans = Array(m.length)
.fill(0)
.map((_x, _i) => m[m.length - 1 - _i][i])
.filter(x => x != 0);
acc.push(trans);
return acc;
}, []);
for (let move of moves) {
let poped = stack[move - 1].pop();
if (!poped) continue;
if (bascket.slice(-1)[0] === poped) {
answer += 2;
bascket.pop();
} else bascket.push(poped);
}
return answer;
}
❔ 올바른 괄호
푸는 방법은 다양하지만 스택/큐로 어떻게 접근해야하나 고민했다
문제풀이
function solution(s) {
let stack = [];
for (_s of s) {
if (_s === '(') {
stack.push(_s);
continue;
}
if (!stack.pop()) return false;
}
return !stack.length ? true : false;
}
❔ 기능개발
레벨2 치고는 쉽게 풀었다 그런데 워낙 사고하는 스피드가 느려서 많이 푸는 연습을 해야할듯
문제풀이
function solution(progresses, speeds) {
var answer = [];
let lefted = progresses.map((x, i)=> Math.ceil([100-x]/speeds[i]));
let cnt = 0;
let max = lefted[0];
lefted.push(Number.MAX_SAFE_INTEGER);
for(const progress of lefted){
if(progress<=max) {
cnt++;
}else{
answer.push(cnt);
cnt = 1;
max = progress;
}
}
return answer;
}
❔ 프린터
문제 이해하는것도 어려웠다.. 내 이해력 어쩔..ㅋㅋ 처음 풀어보고 두번째는 좀 예쁘게 풀어보려고 애썼는데 가독성이 좋은지는 모르겠다
첫번째 문제풀이
function solution(priorities, location) {
let answer = [];
let _priorities = priorities, _location = location, max = Math.max(...priorities);
while(true){
const cur = _priorities.shift();
if(_location===0 && max === cur){
answer.push(cur);
break;
}
if(cur === max){
answer.push(cur);
max = Math.max(...priorities);
}else{
_priorities.push(cur);
}
_location--;
if(_location ==-1) _location = _priorities.length-1;
}
return answer.length;
}
두번째 문제풀이
function solution(priorities, location) {
let answer = 0;
let _priorities = priorities.map((x, i) => ({ priority: x, loc: i }));
while (true) {
const max = Math.max(...Array.from(_priorities.values(), (x, i) => x.priority));
const cur = _priorities.shift();
if (cur.loc === location && cur.priority === max) {
answer++;
break;
}
if (cur.priority === max) answer++;
else _priorities.push(cur);
}
return answer;
❔ 다리를 지나는 트럭
문제가 너무 난해해서 이해하는데 힘들었다.
다리 위에 올라와있는 트럭들의 총 무게를 구해 다음 트럭이 진입 할 수 있는지 확인했고 모든 트럭이 진입하였을때 다리길이를 더해주었다.
문제풀이
function solution(bridge_length, weight, truck_weights) {
let time = 0;
let ing = [];
while (truck_weights.length) {
const curWeight =ing.slice(0, bridge_length-1).reduce((acc, cur) => acc += cur, truck_weights[0]);
if (curWeight <= weight) ing.push(truck_weights.shift());
else ing.push(0);
if(ing.length === bridge_length) ing.shift();
time++;
}
return time += bridge_length;
}