| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 개발일기
- 자바스크립트
- 날씨 웹 만들기
- [파이썬 실습] 중급 문제
- 엘리스 ai 트랙
- [AI 5기] 연습 문제집
- 개발공부
- 코드스테이츠
- 프로그래머스
- 자바스크립트 날씨
- JavaScript
- 간단한 날씨 웹 만들기
- 자바스크립트 split()
- 프론트개발
- HTML
- 엘리스 AI 트랙 5기
- 코딩부트캠프
- 부트캠프
- reactnativecli
- 자바스크립트 sort()
- 프론트개발공부
- 엘리스
- 자바스크립트 날씨 웹 만들기
- [파이썬 실습] 기초 문제
- leetcode
- [파이썬 실습] 심화 문제
- 삼항연산자
- 리트코드
- RN 프로젝트
- 자바스크립트 reduce()
- Today
- Total
개발조각
[프로그래머스] 예산 본문
2021.10.06에 푼 문제입니다.
예산 문제는 진짜 이상하다 정도로 안풀렸는데 막상 답을 알게 되니까 왜 못풀었지 싶더라고요😓


해결방안
function solution(d, budget) {
var answer = 0;
d.sort((a,b) => a - b);
for (let i of d) {
if (i > budget) {
break;
} else {
budget -= i;
answer += 1;
}
}
return answer;
}
해결방안 순서
- d 배열 오름차순으로 정렬하기
- for of를 이용해 d 배열의 원소의 갯수 만큼 반복 한다.
- for of 안에서 budget의 d 배열의 원소를 만큼 빼주고, answer에서는 1씩 더해준다.
3단계는 3단계 설명에서 자세하게 쓰겠습니다.
1단계. d 배열 오름차순으로 정렬하기
이번 문제는 "최대 몇 개의 부서에 물품을 지원할 수 있는지"를 구하는 문제입니다.
최대로 물품을 지원하기 위해서는 금액이 적은 것 부터빼면 최대한 많은 물품을 지원할 수 있도록 했습니다.
그래서 d배열을 오름차순 해주었습니다.
d.sort((a,b) => a - b);
MDN Web Docs
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.
구문 : 배열.sort(정렬 순서를 정의하는 함수)
sort() 메서드로는 오름차순과 내림차순으로 정렬할 수 있습니다.
프로그래머스에서 자주 사용하니까 꼭 외우시길 바랍니다.!!
- sort((a,b)=>a-b); -> 오름차순
- sort((a,b)=>b-a); -> 내림차순
전에도 얘기했다 싶이 sort() 만 쓰시면 제출 수 채점하기에서 오류나옵니다.
테스트 1 : d = [1,3,2,5,4]; budget = 9;
d.sort((a,b) => a - b); -> d=[1,2,3,4,5]
테스트 2 : d = [2,2,3,3]; budget = 10;
d.sort((a,b) => a - b); -> d=[2,2,3,3]
2단계. for of를 이용해 d 배열의 원소의 갯수 만큼 반복 한다.
이번 문제는 원소를 바로 사용하는게 더 빠르겠다 싶어서 for문이 아닌 for of문을 사용해 주었습니다.
for (let i of d){}
MDN Web Docs
for...of 명령문은 반복가능한 객체 (Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.
구문 :
for (variable of iterable) {
statement
}
- variable : 각 반복에 서로 다른 속성값이 variable에 할당됩니다.
- iterable : 반복되는 열거가능(enumerable)한 속성이 있는 객체.
MDN에서는 이렇게 설명하지만 간단하게 설명하자면
for...of는 배열 값 순환이라하면 쉽게 이해하실 수 있습니다.
const arr = ['a', 'b', 'c'];
for (const element of arr) {
console.log(element);
}
// "a"
// "b"
// "b"
테스트 1 : d = [1,3,2,5,4]; budget = 9;
d.sort((a,b) => a - b); -> d=[1,2,3,4,5]
for (let i of d){} -> i = 1, i = 2, i = 3, i = 4, i = 5 까지 반복
테스트 2 : d = [2,2,3,3]; budget = 10;
d.sort((a,b) => a - b); -> d=[2,2,3,3]
for (let i of d){} -> i = 2, i = 2, i = 3, i = 3 까지 반복
3단계. for of 안에서 budget의 d 배열의 원소를 만큼 빼주고, answer에서는 1씩 더해준다.
여기서 구해야 되는 것은 "최대 몇 개의 부서에 물품을 지원할 수 있는지"를 구해야 됩니다.
for (let i of d) {
if (i > budget) {
break;
} else {
budget -= i;
answer += 1;
}
}
return answer;
}
for of에서는 d배열의 값을 순환합니다.
이점을 활용하여 "최대 몇 개의 부서에 물품을 지원할 수 있는지"를 구해야 되는데요.
그러기 위해서 for of안에는
- budget(예산) - 오름차순으로 정렬된 d배열(각 부서에서 신청한 금액)의 원소 = 부서가 원하는 금액 빼주기
- budget - d배열을 뺀 횟수를 구해주기 = 지원 가능 부서 하나씩 더하기
을 넣어주어야 됩니다.
여기서 중요한 점!!!
"budget - d배열의 원소" = "마이너스(-)"가 되면 안되겠죠?
그래서 1단계에서 배열은 오름차순으로 정렬한거고 if else문을 써주는 겁니다.
그래서 i > budget경우에만 앞에 1,2번을 실행할 수 있게 해줍니다.
테스트1로 설명
d = [1,3,2,5,4]; budget = 9;
1단계에서 정렬된 d배열 d=[1,2,3,4,5]
for of문 i=1일 때
i > budget -> 1>9 false -> else문으로
budget -= i; -> 9 - 1 = 8
answer += 1; -> 0 + 1 = 1
budget = 8;
for of문 i=2일 때
i > budget -> 2>8 false -> else문으로
budget -= i; -> 8 - 2 = 6
answer += 1; -> 1 + 1 = 2
budget = 6;
for of문 i=3일 때
i > budget -> 3>6 false -> else문으로
budget -= i; -> 6 - 3 = 3
answer += 1; -> 2 + 1 = 3
budget = 3;
for of문 i=4일 때
i > budget -> 4>3 true -> if문으로
break;
return answer; -> answer = 3
여기까지 프로그래머스 예산 해결방안에 대해 설명해보았습니다.
'알고리즘🅰 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 실패율 (0) | 2022.02.11 |
|---|---|
| [프로그래머스] 약수의 개수와 덧셈 (0) | 2022.02.09 |
| [프로그래머스] K번째수 (0) | 2022.02.09 |
| [프로그래머스] 내적 (0) | 2022.02.08 |
| [프로그래머스] 없는 숫자 더하기 (교집합, 차집합) (0) | 2022.02.08 |