프로그래머스의 문제 2가지만 풀었다.
- S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다.
- 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.
- 물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.
- 부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.
- 제한사항
- d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
- d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
- budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.
```java
int solution(int[]d, int budget){
//d : 부서별 신청 예산
//bu : 예산
// 최대 값을 구해야함. == 정렬로 쉽게 해결 가능할 것 같다.
int answer =0;
//1. 배열을 오름차 순으로 정렬.
Arrays.sort(d);
//2. 배열에서 값을 하나씩 찾으며 예산과 비교한다.
for (int i : d){
//부서의 신청 예산이 남은 예산과 비교해 예산보다 적거나 같을 경우 지금이 가능하다.
if(i <=budget){
//지급한 부서수를 증가
answer++;
//예산을 삭감.
budget -=i;
}
}
return answer;
}
```
최대한의 경우를 요구했기 때문에 배열을 오름차순으로 정렬해 낮은수부터 제거하도록 구현했다.
자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.
조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.
자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.
public int solution(int n) {
// 1. n 보다 큰 수이면서 . n과 1의 개수가 동일하다.
// 2. 조건을 만족하면서 . "가장 작은 수"
// solution
// n부터 1씩 증가하며 반복
// 증가된 수 u 를 이진수로 변환
// 변환된 2진수의 1의 개수를 카운트 한다.
// 카운트된 값이 n(2) 의 1의 개수가 동일한 경우 해당 값을 반환
//n 의 배열을 기록한 변수.
final int standard = Integer.bitCount(n);
//정답을 대입하는 변수.
int answer = 0;
while(answer ==0 ){
n++; //n을 증가
int temp = Integer.bitCount(n);
if(temp == standard) answer = n;
}
return n;
기존에는
1. 바이너리스트링으로 이진수로 변환
2. 정규식으로 0을 제거
3. 남은 1의 개수만 카운트로 해결
이 방식은 시간 복잡도면에서 효율성 검증에 실패했다
방법을 찾아 보니 Integer.bitCount를 사용시 true value이 개수만 반환해주는 메서드가 있는걸 알게 되었다.
인자로 정수를 전달할 경우 1(True)인 값의 개수만 가져오게 된다