예산 , 다음 큰 수 찾기

DeadWhale·2022년 10월 17일
0

프로그래머스

목록 보기
16/21
post-thumbnail

프로그래머스의 문제 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)인 값의 개수만 가져오게 된다

0개의 댓글