티스토리 뷰
문제는 링크에 잘 나와있으니 따로 첨부하지 않겠다.
배운 것에 대한 내용을 적을 것이다.
1. map() 익숙해지기
map() 메소드를 그동안 몇 번 써보긴했는데 막상 백지상태에서 쓰는거랑 mdn에서 보고 쓰다가 백지상태에서 써보니 잘 써지지가않았다. 분명 아래의 코드를 map()을 이용하면 더 간단하다는 것을 알았음에도 사용하지 못했다.
풀다보면 쓸 일이 많으니 더 익숙해져야겠다.
// 내 코드
let days = [];
for (let i = 0; i < progresses.length; i++) {
days.push(Math.ceil((100 - progresses[i]) / speeds[i]));
}
// map()사용하여 더 간결하게
const days = progresses.map((progress, index) =>
Math.ceil((100 - progress) / speeds[index])
);
console.log(days);
2. 구현 능력
어떻게 구현해야할지 아이디어는 생기는데 코드를 구현하는 것에서 어려움이 있다. 그나마 생각해서 for문 을 쓰며 테스트했는데 정답이아니었다. 결국 다른 분 답을 봤지만, 보는 거에 그치지 않고 어떤식으로 했는지 원리를 파악하며 사고력을 키울 것이다.
사고를 기르자!
- FIFO
문제에서 '먼저 배포되어야 하는 순서대로 -' 라고 명시했다.
큐(queue)의 원리를 생각하자. 선입선출 원리이다. 문제에서도 명시했듯 뒤에 값이 더 커도 기다렸다가 앞에 있는 것부터 같이 배포되어야 했다. 프린트의 방식이라면 뒤에값이 더 크면 앞에있는 값을 뒷배열에 추가시키는 방법을 썼겠지만, 이 문제에서는 거기까지는 아니었고
무조건 앞에있는게 먼저 나가는게 원칙 이었다.
이 때는 첫 번째 값을 항상 기준으로 두고 나머지 배열값들을 비교하며 문제를 푸려는 사고를 가지자.
- 개수를 반환해야 할 때
최종적으로 개수를 반환해야 될 때 'let = count = 0 or 1' 변수를 초기값으로 선언하는 것
사실 내가 생각한 방법은 아래와 같은데, 이렇게 특정 조건에 따라서 배열안에 배열을 만들 때는 어떻게해야할까?
// 일 수대로 분리한다.
// [[5], [10, 1, 1], [ 20, 1]]
// 각 day의 day[0].length 를 세준다. b[1].length
// 이 방법으로 하려면?
3. for 문에 초기값(initialization) 추가
i = 0 외에 j = 0 도 추가시킬 수 있다.
아래 두 for문은 방식은 같으나 초기값에 j를 추가, count변수 생성없이 바로 answer[j]에 값을 추가하는 것의 차이었다.
일반적인 방법
let answer = [];
let prodDay = 0
for (let i = 0; i < days.length; i++) {
if ( prodDay < days[i]) {
answer.push(1);
prodDay = days[i]
} else {
let temp = answer.pop();
answer.push(++temp);
}
}
return answer;
초기값 j=0을 조건에 명시한 코드
쉼표 ' , ' 로 구분해주면 된다.
let answer = [0];
let maxDay = days[0];
for (let i = 0, j = 0; i < days.length; i++) {
if (days[i] <= maxDay) {
answer[j] += 1;
} else {
maxDay = days[i];
answer[++j] = 1;
}
}
return answer;
추가적으로 for문에 대해서 좀 더 찾아봤는데 모든 for문의 조건은 optional이라는 것을 알게 되었다.
특히 condition block에서도 조건을 명시하지 않을 수 있는데 이 부분에서는 무한루프가 일어날 수 있으므로 break로 종료를 시켜주는 문이 필수적으로 있어야한다.
for (let i = 0;; i++) {
console.log(i);
if (i > 3) break;
// more statements
}
답안
function solution(progresses, speeds) {
let answer = [0];
const days = progresses.map((progress, index) =>
Math.ceil((100 - progress) / speeds[index])
);
let maxDay = days[0];
for (let i = 0, j = 0; i < days.length; i++) {
if (days[i] <= maxDay) {
answer[j] += 1;
} else {
maxDay = days[i];
answer[++j] = 1;
}
}
return answer;
}
'알고리즘 > 프로그래머스-Programmers' 카테고리의 다른 글
[프로그래머스-해시] 베스트앨범 - 자바스크립트(JavaScript) (0) | 2022.03.22 |
---|---|
[프로그래머스-해시] 위장 - 자바스크립트(JavaScript) (0) | 2022.03.22 |
[프로그래머스-해시] 완주하지 못한 선수 - 자바스크립트(JavaScript) (0) | 2022.03.19 |
[프로그래머스-스택/큐] 다리 위를 지나는 트럭 - 자바스크립트(JavaScript) (0) | 2022.03.19 |
[프로그래머스-스택/큐] 프린터 -자바스크립트(JavaScript) (0) | 2022.03.19 |
- Total
- Today
- Yesterday
- 리액트네이티브
- 무한스크롤
- 프로그래머스 베스트앨범 자바스크립트
- 백준
- 자바스크립트
- 모두를위한컴퓨터과학
- python
- javascript
- 자바스크립트알고리즘
- 항해99
- html
- React
- 프로그래머스
- 네트워크
- 자바스크립트 클로저
- React Query
- network
- 리액트
- 타입스크립트
- 알고리즘자바스크립트
- 모두를 위한 컴퓨터 과학
- github
- cs50
- 프로그래머스 자바스크립트
- 자바스크립트 비동기 처리
- css
- 클로저
- reactquery
- GIT
- 실전프로젝트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |