기록하지 않았다면 잃어버릴 시간들
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
Home
  • 분류 전체보기 (184)
    • Lang (6)
      • c++ (2)
      • Java (2)
      • python (2)
    • 프레임워크 (18)
      • Spring (16)
      • JPA (2)
    • 알고리즘 (141)
      • 이론 (4)
      • 백준 (59)
      • Codility (13)
      • 프로그래머스 (65)
    • CS (4)
      • 운영체제 (0)
      • 자료구조 (0)
      • DB (4)
      • 네트워크 (0)
      • 보안 (0)
    • 기타 (7)
    • 프로젝트 (4)
      • 게시판 만들기로 배우는 Spring Data JP.. (4)
블로그 내 검색

기록하지 않았다면 잃어버릴 시간들

새로운 것을 배우는게 즐거운 개발자입니다.

  • 알고리즘/백준

    BOJ 2613 숫자구슬 / C++

    2022. 12. 4.

    by. 내이름은 킹햄찌

    https://www.acmicpc.net/problem/2613

     

    2613번: 숫자구슬

    첫째 줄에 구슬의 개수 N과 그룹의 수 M이 주어진다. 둘째 줄에는 각 구슬이 적혀진 숫자가 왼쪽부터 차례로 주어진다. N은 300 이하의 자연수, M은 N이하의 자연수이며, 구슬에 적혀진 숫자는 100

    www.acmicpc.net

    아이디어

    매개변수 탐색으로 각 그룹의 합의 최대값이 최소값이 되는 값을 찾고 그에 맞는 그룹을 찾으면 됩니다.

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int N, M;
    int totalSum;
    vector<int> arr;
    vector<int> group;
    
    void input() {
    	cin >> N >> M;
    	arr.resize(N);
    	for (int i = 0; i < N; i++) {
    		cin >> arr[i];
    		totalSum += arr[i];
    	}
    }
    
    bool checkMin(int target) {
    	int k = 0;
    	int sum = 0;
    	int divCnt = 1;
    	for (auto iter : arr) {
    		//원소의 합이 t보다 작거나 같은 그룹을 만들어야 함
    		if (sum + iter > target) {
    			sum = 0;
    			divCnt++;
    		}
    		//그룹의 원소가 M보다 크다면 최솟값을 더 증가 시킬 수 있음
    		if (divCnt > M) return true;
    		sum += iter;
    		if (k < sum) k = sum;
    	}
    
    
    	//그룹의 원소 최대값이 mid보다 클경우 mid를 더 줄여야 함
    	return k > target;
    }
    
    void findGroup(int n) {
    
    	int sum = 0, cnt = 0;
    	for (int i = 0; i < N; i++) {
    		sum += arr[i];
    		if (sum > n) {
    			sum = arr[i];
    			M--;
    			cout << cnt << " ";
    			cnt = 0;
    		}
    		cnt++;
    		//남은 원소가 남은 M의 개수와 같다면
    		if (N - i == M) break;
    	}
    	//나머지는 1로 채움
    	while (M--) {
    		cout << cnt << " ";
    		cnt = 1;
    	}
    }
    
    
    int binarySearch(int l, int r) {
    	while (l < r) {
    		int mid = (r + l) >> 1;
    		//최대값이 더 커질 수 있을때
    		if (checkMin(mid)) {
    			l = mid + 1;
    		}
    		else {
    			r = mid;
    		}
    	}
    	return r;
    }
    
    void solution() {
    	int sol = binarySearch(1, totalSum);
    	cout << sol << "\n";
    	findGroup(sol);
    
    }
    
    int main(void) {
    	input();
    	solution();
    }

     

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ 1072 게임 / C++  (0) 2022.12.04
    BOJ 1939 중량제한 / C++  (0) 2022.12.03
    BOJ 18428 감시 피하기 / C++  (0) 2022.12.03
    BOJ 2632 피자판매 / C++  (1) 2022.12.03
    BOJ 3109 빵집 / C++  (2) 2022.09.15

    댓글

    관련글

    • BOJ 1072 게임 / C++ 2022.12.04
    • BOJ 1939 중량제한 / C++ 2022.12.03
    • BOJ 18428 감시 피하기 / C++ 2022.12.03
    • BOJ 2632 피자판매 / C++ 2022.12.03
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
내이름은 킹햄찌

티스토리툴바